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

时间:2011-12-12 11:12:00

标签: ruby perl bash sed awk

我有一个从工具输出的文件(从DB查询)。其中一个字段在某些行的末尾有^ M个字符。这会导致我的输出被破坏。当前行以^ M结尾时,如何将下一行附加到当前行。

我的机器安装了sed,awk,perl,ruby和python,我正在使用bash。

我使用sed尝试了以下内容:

sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile

但那没用。

请告知。

谢谢, Karthick S。

4 个答案:

答案 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$
相关问题