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

在unix shellscript中使用sed命令删除两个字符串之间的换行符,unix,sed,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| 从这个文件读取数据时,我不想从每条记录的末尾删除换行符。我只想删除管道符号中两个字符串之间的\n(如:shankar) 实际上在unix my dat文件中。。。由5

我有一个文件(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|
从这个文件读取数据时,我不想从每条记录的末尾删除换行符。我只想删除管道符号中两个字符串之间的\n(如:shankar


实际上在unix my dat文件中。。。由500个字符组成。。所以前300个字符出现在第一行,下一个200个字符出现换行符。。。但是,500应该被视为单线。。因此,我试图添加由于换行而中断的字符。

实际上不清楚连接两行的标准是什么。但是,这可能会对显示的数据产生影响:

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/
删除换行;'}'结束操作组。

解释(与灵感的不同):

  • 如果我们遇到一行不以“|”结尾,则分支到创建的寄存器
    /|$/!ba

  • 稍微不同的方法:

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

    如果一行正好由300个字符组成,请添加下一行。

    你好,乔纳森,我有一个文件,其中包含这样的数据459,| 1998-11-047 | a | b | c\n efg | d | e | n 459,| 1998-11-047 | a\n c | b | c\n efg | d | e | \n基本上我要做的是,我必须移除两个管道(|)之间的所有管道(|)。。我不想删除\N。。。只是为了做dif我把它放进了\n和\n。。。我需要删除管道中任何字符串之间的\n…@jcrshankar:正如您刚刚发现的,注释不会保留换行符。用更多的例子来澄清你的问题。我不清楚“两条管道之间”的标准是什么。我怀疑@Raymond的说法是正确的;不以管道结尾的行需要连接到下一行,并删除换行符(而不是替换为空白)。。。由500个字符组成。。所以前300个字符出现在第一行,下一个200个字符出现换行符。。。但是,500应该被视为单线。。因此,我试图附加的字符已经打破了bec的newline@jcrshankar:修复破坏数据的进程。如果你绝对不能改变破坏者,那么你需要问你的问题,清楚地解释问题是什么。你不需要描述你认为它应该如何被修复;你只要描述一下结果应该是什么。到目前为止,您已经更改了两次需求。我想现在我的问题可能很清楚了。很抱歉,最后一段写得太多了。文件总共500个字符长,只有两行吗?或者它是由许多行组成的,长度不超过500个字符,但长度超过300个字符的行通过在第300个字符后插入换行符而被截断?本节中提到的管道符号是否仍然相关?你怎么知道线路什么时候被切断了?请学习使用shift键并写出完整的英文单词-“bec”不是一个可接受的缩写。test.dat文件由许多行组成,所有行中正好有500个字符。当该行到达第300个字符时,通过插入换行符和下一行中的下一个200个字符,该行已被截断。管道符号仅与此相关,这里我使用管道作为分隔符。。
    awk 'ORS=/^[0-9]/?"\0":"\n"' file
    
    ruby -ne 'print /^\d+/?"#{$_.chomp}":"#{$_}";' file
    
    sed '/^.\{300\}$/{N;s/\n//}' inputfile