我有一个像这样的文件
{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
...
逗号不会附加到行尾。相反,它附加在一个新的行。任何想法将不胜感激。谢谢。
答案 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
'的行(错过冒号)。你的选择。