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
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 ...)。
一种使用方式GNU coreutils
:
< file.txt tr -d '\r'
在 ubuntu 上,您使用该fromdos
实用程序
fromdos test.txt
上面的示例将采用 MS-DOS 或 Microsoft Windows 文件或具有不同行分隔符的其他文件,并使用新的行分隔符格式化文件以在 Linux 和 Unix 中读取。
有很多选择..您可以尝试其中任何一个.. http://www.theunixschool.com/2011/03/different-ways-to-delete-m-character-in.html
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
请注意,如果您要转换多字节文件,则需要格外小心,并且可能应该尝试使用正确的 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。
您可以使用以下命令:
dos2ux file.in>file.out or:
在 perl 中:
perl -pi -e 's/\r//g' your_file
或者你可以这样做:
:%s/[ctrl-V][CTRL-M]//g
如果您需要按文件结尾过滤,则修改获胜答案
grep -URl ^M . | grep .php | xargs dos2unix
我用的是dos2unix而不是fromdos,但效果应该是一样的。