0

我有这样的文件

{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  

...

附言。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  
...  

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

4

1 回答 1

1

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

编辑您的文件以删除 DOS 行结尾:有关如何执行此操作的信息,请参阅如何在bash脚本中将 DOS/Windows 换行符转换为 Unix 换行符。或者,正如Beta指出的那样,您可以在添加逗号的同时执行此操作:

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

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

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

它使用bashANSI-C 引用机制将 CR 嵌入到命令字符串中。

你的问题并不完全一致。您说“包含line:”的行,但您的代码处理“包含line”的行(缺少冒号)。你的选择。

于 2013-11-12T02:55:57.647 回答