在unix shell脚本中使用sed命令删除两个字符串之间的换行符

时间:2011-02-21 14:12:33

标签: unix sed

我有一个文件(test.dat),其中包含这样的数据

459|199811047|a |b |shan
kar|ooty|
460|199811047|a |b |guru|cbe|

但我需要它:

459|199811047|a |b |shankar|ooty|
460|199811047|a |b |guru|cbe|

在读取此文件中的数据时,我不想从每条记录的末尾删除换行符。我只想删除管道符号中两个字符串( like:shankar )之间的\ n。

实际上在unix我的dat文件中...由500个字符组成..所以前300个字符出现在第一行并且为下一个200字符得到了中断(换行符)...但是500应该被视为单行..所以我试图追加由于换行符而中断的字符。

4 个答案:

答案 0 :(得分:1)

目前尚不清楚加入两条线的标准是什么。但是,这可能会对显示的数据起作用:

sed -e '/|shan$/N;s/|shan\nkar|/|shankar|/' test.dat

在MacOS X 10.6.6上使用sed进行测试。

如果标准为'如果该行不以管道结束,请将其与下一行连接',然后这样做:

sed -e '/[^|]$/{N;s/\n//;}' test.dat

搜索说“如果线路没有以管道结束”; '{'开始一组行动; N连接下一行,中间用换行符; s/\n//删除换行符; '}'结束了这组操作。

答案 1 :(得分:1)

How can I replace a newline (\n) using sed?启发

sed ':a;N;/|$/!ba;s/\n//g'

解释(与灵感的区别):

  1. 如果我们遇到一行不以'|'结尾,则跳转到创建的寄存器/|$/!ba

答案 2 :(得分:0)

awk 'ORS=/^[0-9]/?"\0":"\n"' file

ruby -ne 'print /^\d+/?"#{$_.chomp}":"#{$_}";' file

答案 3 :(得分:0)

略有不同的方法:

sed '/^.\{300\}$/{N;s/\n//}' inputfile

如果一行包含正好300个字符,请附加下一行。