如何将^ M $换行符从dos转换为unix(dos2unix无效)

时间:2016-06-14 02:02:13

标签: bash dos2unix

试图删除从Windows生成的错误换行符。

$cat -e file.xml
foo^M$
bar$
$
hello world1$
hello world2$

应该有“foobar”,其间没有任何换行符,而所有新行都应该保留。 我知道在emacs中我们可以用'RET'替换“^ M ^ J”,但我有一个巨大的文件,我不想打开它但只想用命令行来转换它。

我尝试了dos2unix,但它只删除了“^ M”部分,仍然会渲染一个破碎的单词/句子。还尝试了tr -d '\r'sed 's:^M$::g'sed 's:^M$\n:\n:g',但都无效。任何人都知道如何正确地做到这一点?

3 个答案:

答案 0 :(得分:1)

我已将您的示例文件复制为:

$ cat -e so.txt
foo^M$
bar$
line2$
line3$

你可以在' gulp'中使用Perl。模式:

$ perl -0777 -pe 's/\r\n//g' so.txt
foobar
line2
line3

使用大多数面向行的方法的问题是\r\n被读作一行。

你可以这样做:

$ perl -pe 's/\r\n//' /tmp/so.txt
foobar
line2
line3

以及......

答案 1 :(得分:1)

使用awk

$ cat -e so.txt
foo^M$
bar$
line2$
line3$

$ awk 1 RS=$'\r\n' ORS= so.txt
foobar
line2
line3

$ awk 1 RS=$'\r\n' ORS= so.txt | cat -e # Just for verification
foobar$
line2$
line3$

它将记录分隔符设置为\r\n&amp;使用ORS=<empty string>

打印记录

答案 2 :(得分:0)

也许以下内容可行

sed -e 's/[\n\r]//g' old_file.txt > new_file.txt

将起作用