unix将字符和下一行合并为一行

时间:2017-05-29 18:33:10

标签: unix sed

$ cat TPSCIS1705291200.err

0301705293504895     000003330011868452100001742N
#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N
#ERROR - Can not find Account:12404797-010

在这里,我希望将最后一个字符N和下一行字符#替换成一行

预期输出应该类似于

0301705293504895     000003330011868452100001742N,#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N,#ERROR - Can not find Account:12404797-010

请帮助我无法找到最佳方法,因为字符N和#在不同的行中

3 个答案:

答案 0 :(得分:0)

sed与新行不匹配。一个可能的技巧是首先将它们“翻译”为其他角色,然后进行sed - 替换。

在这段代码中,我使用tr命令将换行符替换为另一个'carriage feed'字符(`\ f'),然后用sed替换它,最后替换掉那些新行

cat myfile | tr '\n' '\f' | sed -e "s/N$(echo '\f')/N,#/g" | tr '\f' '\n'

上面的另一个诡计是对echo '\f\执行命令替换,因为它也不能成为正则表达式的一部分!

工作代码(在MacOS的bash中):

-- /tmp » cat in
0301705293504895 000003330011868452100001742N
ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N
ERROR - Can not find Account:12404797-010
--- /tmp » cat in| tr '\n' '\f' | sed -e "s/N$(echo '\f')/N,#/g" | tr '\f' '\n'
0301705293504895 000003330011868452100001742N,#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N,#ERROR - Can not find Account:12404797-010

答案 1 :(得分:0)

看起来你只想合并其他所有行:

awk 'NR%2 { printf "%s,", $0; next} 1' input

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -i ':a;/N$/N;s/\n#/,#/;ta;P;D' file

如果当前行以N结尾,而后续行以#开头,则用,替换换行符并重复。否则打印第一行并重复。