我有一个从工具输出的文件(从DB查询)。其中一个字段在某些行的末尾有^ M个字符。这会导致我的输出被破坏。当前行以^ M结尾时,如何将下一行附加到当前行。
我的机器安装了sed,awk,perl,ruby和python,我正在使用bash。
我使用sed尝试了以下内容:
sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile
但那没用。
请告知。
谢谢, Karthick S。
答案 0 :(得分:5)
你看到的^ M角色实际上可能是回车。您应该匹配正则表达式中使用\ r的那些。数据可能是由一个系统插入到数据库中的,该系统使用CRLF作为行结尾(Windows最有可能)而不仅仅是LF(像大多数* nix系统那样)。我猜他们之前已经有换行了,所以你可能想要删除它们,而不是用换行符替换它们。
您的系统上可能有dos2unix命令,可以为您转换这些行结尾。
您可能希望首先使用dos2unix确保行结尾一致。之后,您可以删除这样的换行符:cat infile | dos2unix | tr -d '\n' > outfile
。
如果您想要一个以前使用换行符的空间,可以使用cat infile | dos2unix | tr '\n' ' ' > outfile
。
作为旁注,使用sed删除换行很难,因为sed编辑文件中的行一次处理一行。
答案 1 :(得分:1)
^M
表示ctrl + M,它是一个字符,而不是两个字符。当你进行更换时,你输入的是两个字符还是一个?
一个字符: ctrl + v 然后 ctrl + m (正确)
两个字符: ^ 然后 M (不正确,但看起来可能相同)
答案 2 :(得分:0)
我希望我能正确理解你的要求。见下面的测试:
名为测试的文件:
abc^M
___2ndline
xyz^M
###2ndline again
注意,^M
我使用ctrl-v, ctrl-m
输入了kent$ awk '/^M/{gsub(/^M/,"");printf $0;next;}1' test
abc___2ndline
xyz###2ndline again
现在看到输出跟随awk行。我希望这就是你所需要的:
{{1}}
答案 3 :(得分:0)
为了理解文件每行末尾出现的字符,我使用了@potong评论:
sed -n 'l0' file
>>> 1st line\r$
>>> last line\r$
我的文件以每行\r$
结尾,所以我做了:
sed -i "s/\r//g" file
通过重写文件来摆脱\r
(或^M
)。以下是sed
的结果打印:
sed -n 'l0' file
>>> 1st line$
>>> last line$