$ 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和#在不同的行中
答案 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
结尾,而后续行以#
开头,则用,
替换换行符并重复。否则打印第一行并重复。