11

I have found that many of my files have DOS line endings. In VI they look like this: "^M". I don't want to modify files that don't have these DOS line endings. How do I do this using a bash script? Thanks!

EV

4

8 回答 8

19
grep -URl ^M . | xargs fromdos

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

-U让 grep 考虑行尾而不是默认剥离它们

-R使其递归

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

然后你将该列表传递到转换器命令(它fromdos在 ubuntu 上,dos2unix我来自哪里)。

注意:实际上不要输入^M. 相反,您需要按<Ctrl-V>then<Ctrl-M>插入^M字符并让 grep 了解您要执行的操作。或者,您可以输入$'\r'代替^M(但我认为这可能仅适用于 bash ...)。

于 2012-09-20T21:40:58.353 回答
5

一种使用方式GNU coreutils

< file.txt tr -d '\r'
于 2012-09-21T01:34:25.543 回答
4

在 ubuntu 上,您使用该fromdos实用程序

fromdos test.txt

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

于 2012-09-20T09:43:58.593 回答
1

有很多选择..您可以尝试其中任何一个.. http://www.theunixschool.com/2011/03/different-ways-to-delete-m-character-in.html

于 2012-09-20T08:43:07.193 回答
1
cat origin_file.txt | sed "s/^M//" > dest_file.txt

你必须做上面提到的同样的事情,ctl-V 然后 ctl-M 来得到那个字符。这对我来说更可取,因为它可以跨许多平台移植,并且在 bash 中保持简单。

在 ubuntu 上,我也发现这很有效:

猫 origin_file.txt | sed "s/\r//" > dest_file.txt

于 2021-01-15T23:46:19.973 回答
0

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

如果它是纯 ASCII 文件,则以下两种方法都可以。

flip程序(在 Debian 中也称为包)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 重新编码:

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

输出:

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

转换为 unix 行尾:

recode pc.. a b
file a b

输出:

a: ASCII text
b: ASCII text

recode 将dos line-endings 缩写为pc,所以逻辑pc..是:从pc 格式转换为默认的,即latin1 with unix line-endings。

于 2012-09-20T09:04:24.947 回答
0

您可以使用以下命令:

   dos2ux file.in>file.out or:

在 perl 中:

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

或者你可以这样做:

  • 在 vi 中打开
  • 进入命令模式
  • 类型:%s/[ctrl-V][CTRL-M]//g
于 2012-09-20T08:39:45.843 回答
0

如果您需要按文件结尾过滤,则修改获胜答案

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

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

于 2016-02-05T17:28:54.413 回答