使用sed在某些特定行的末尾附加文本

时间:2013-11-12 02:46:08

标签: sed

我有一个像这样的文件

{CRLF  
sum: 21.46,CRLF  
first: 99.10,CRLF  
last: 57.71 CRLF  
}CRLF  
{CRLF  
sum: 159.32,CRLF  
first: 456.71,CRLF  
last: 89.27 CRLF  
}CRLF  

...

PS。 CRLF是Windows系统中的换行符,而不是此文件中的真正文本。

我想在包含“last:”的每一行的末尾添加一个逗号。
我使用了以下命令

sed '/last/ s/$/,/' old.txt >new.txt  

但是我得到了一个奇怪的结果

{CRLF  
sum: 21.46,CRLF  
first: 99.10,CRLF  
last: 57.71 CR  
,CRLF  
}CRLF  
{CRLF  
sum: 159.32,CRLF  
first: 456.71,CRLF  
last: 89.27 CR  
,CRLF  
}CRLF  
...  

逗号不会附加到行尾。相反,它附加在一个新的行。任何想法将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您的数据文件具有DOS样式(Windows样式)CRLF行结尾。 sed在CR和LF之间插入逗号(因为它不知道CRLF行结尾,而CR只是行尾之前的另一个字符)。

编辑文件以删除DOS行结尾:有关如何执行此操作的信息,请参阅How to convert DOS/Windows newline to Unix newline in bash script。或者,正如Beta指出的那样,您可以在添加逗号的同时执行此操作:

sed -e 's/.$//' -e '/last:/s/$/,/'

如果应用于具有Unix行结尾的文件,这是有点危险的;它也将删除这些行上的最后一个字符。将CR嵌入脚本中可能会更好:

sed -e $'s/\r$//' -e '/last:/s/$/,/'

使用bash的{​​{3}}机制将CR嵌入到命令字符串中。

你的问题并不完全一致。你说'包含line:'的行,但你的代码处理'包含line'的行(错过冒号)。你的选择。