繁体   English   中英

当前行以^ M结尾时,在文件中追加下一行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM