我发现我的许多文件都有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'
许多选项都有..你可以尝试任何这些.. http://www.theunixschool.com/2011/03/different-ways-to-delete-m-character-in.html
你可以使用这个命令:
dos2ux file.in>file.out or:
在perl中:
perl -pi -e 's/\r//g' your_file
或者你可以做:
:%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,但效果应该是一样的。