[英]Append next line in file when the current line ends with ^M
我有一个从工具输出的文件(从DB查询)。 其中一个字段在某些行的末尾有^ M个字符。 这会导致我的输出被破坏。 当前行以^ M结尾时,如何将下一行附加到当前行。
我的机器安装了sed,awk,perl,ruby和python,我正在使用bash。
我使用sed尝试了以下方法:
sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile
但那没用。
请指教。
谢谢,Karthick S.
您看到的^ M字符实际上可能是回车。 您应该匹配正则表达式中使用\\ r的那些。 数据可能是由一个系统插入到数据库中的,该系统使用CRLF作为行结尾(Windows最有可能)而不仅仅是LF(像大多数* nix系统那样)。 我猜他们已经跟着换行了,所以你可能想要删除它们,而不是用换行符替换它们。
您可能在系统上有dos2unix命令,可以为您转换这些行结尾。
您可能希望首先使用dos2unix确保行结尾是一致的。 之后你可以删除这样的新行: cat infile | dos2unix | tr -d '\\n' > outfile
cat infile | dos2unix | tr -d '\\n' > outfile
cat infile | dos2unix | tr -d '\\n' > outfile
。 如果你想要一个以前使用换行符的空间你可以使用cat infile | dos2unix | tr '\\n' ' ' > outfile
cat infile | dos2unix | tr '\\n' ' ' > outfile
cat infile | dos2unix | tr '\\n' ' ' > outfile
。
作为旁注,使用sed删除换行是很困难的,因为sed编辑文件中的行一次处理一行。
^M
表示ctrl + M,它是一个字符,而不是两个字符。 当你进行更换时,你输入的是两个字符还是一个?
一个字符: ctrl + v然后ctrl + m (正确)
两个字符: ^然后M (不正确,但看起来可能相同)
为了理解文件每行末尾出现的字符,我使用了@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$
我希望我能正确理解你的要求。 看下面的测试:
一个名为test的文件:
abc^M
___2ndline
xyz^M
###2ndline again
注意 , ^M
我用ctrl-v, ctrl-m
键入vim
现在看到输出跟随awk行。 我希望这就是你所需要的:
kent$ awk '/^M/{gsub(/^M/,"");printf $0;next;}1' test
abc___2ndline
xyz###2ndline again
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.