在Ubuntu上查找并删除DOS行结尾

我发现我的许多文件都有DOS行结尾。 在VI中它们看起来像这样:“^ M”。 我不想修改没有这些DOS行结尾的文件。 我如何使用bash脚本来做到这一点? 谢谢!

EV

grep -URl ^M . | xargs fromdos 

grep可以获取当前目录下所有具有DOS行结尾的文件列表。

-U使grep考虑行结束,而不是在默认情况下剥离它们

-R使它递归

-l使它仅列出文件名而不是匹配的行

然后你将这个列表输入到转换器命令(这是从Ubuntu的dos2unix ,我从哪里来的)。

注意:不要实际键入^M 相反,你需要按<Ctrl-V>然后<Ctrl-M>来插入^M字符,并让grep明白你要做什么。 或者,你可以输入$'\r'来代替^M (但我认为这可能只适用于bash …)。

在Ubuntu上,你使用了fromdos工具

 fromdos test.txt 

上面的例子将采用MS-DOS或Microsoft Windows文件或其他文件与不同的行分隔符,并使用新的行分隔符格式化文件以在Linux和Unix中读取。

使用GNU coreutils一种方法是:

 < file.txt tr -d '\r' 

你可以使用这个命令:

  dos2ux file.in>file.out or: 

在perl中:

 perl -pi -e 's/\r//g' your_file 

或者你可以做:

  • 在vi中打开
  • 进入命令模式
  • 键入:%s/[ctrl-V][CTRL-M]//g

请注意,如果您要转换多字节文件,则需要格外小心,并且应该尝试使用正确的iconv或重新编码规范。

如果它是一个普通的ASCII文件,下面的两个方法都可以工作。

在Debian中, flip程序也被称为flip ,可以处理行尾。 从手册:

 When asked to convert a file to the same format that it already has, flip causes no change to the file. Thus to convert all files to **IX format you can type flip -u * and all files will end up right, regardless of whether they were in MS-DOS or in **IX format to begin with. This also works in the opposite direction. 

或者你可以使用GNU recode:

 < /etc/passwd recode ..pc | tee ab > /dev/null file ab 

输出:

 a: ASCII text, with CRLF line terminators b: ASCII text, with CRLF line terminators 

转换为unix行尾:

 recode pc.. ab file ab 

输出:

 a: ASCII text b: ASCII text 

recode缩写dos的行结束为pc ,所以pc..的逻辑是:从pc格式转换为默认,这是拉丁文与unix行结束。

如果您需要按文件结尾进行过滤,则对Winning答案进行修改

 grep -URl ^M . | grep .php | xargs dos2unix 

我用dos2unix而不是fromdos,但效果应该是一样的。