我使用 FTP 将 Windows 文件发送到 Unix 系统,并^M
在需要换行的地方附加了该文件,而我只想删除它们。
我可以选择的一种方法是运行dos2unix
命令。
任何人都可以建议另一种方法(例如sed
命令)来删除此类模式吗?
答案1
Windows 行结尾由两个字符序列 CR、LF 组成。 CR 是回车符,有时表示为\r
、\015
、^M
等。Unix 行结尾就是 LF 字符。
仅使用所有 Unix 变体上存在的标准实用程序将 Windows 行结尾转换为 Unix 行结尾的方法是使用tr
公用事业。
tr -d '\r' <thefile >thefile.new && mv thefile.new thefile
如果文件已经具有 Unix 行结尾,则其内容不会更改。
如果当前目录中有很多文件要转换,则可以使用循环。假设您没有任何名称以以下结尾的文件.new
:
for x in *; do
tr -d '\r' <"$x" >"$x.new" && mv "$x.new" "$x"
done
在Linux(不包括一些嵌入式Linux系统)或Cygwin下,可以使用sed
。就地编辑文件的选项-i
特定于这些系统。 CR 字符的表示法\r
更为广泛,但并不通用。
sed -i -e 's/\r//g' thefile
答案2
DOS2UNIX:
sed -i -r -e 's/\r$//' file
UNIX2DOS:
sed -i -r -e 's/$/\r/' file
答案3
sed -i -r -e 's/\r$//' file
对于“dos2unix”优于sed -i -e 's/\r//g' file
对于后者,如果我在 classic-mac 样式文件(其中换行符为 '\r')上运行它,那么新文件不仅不是 Unix 样式,而且根本没有换行符。一切都将排成一行。
编辑:同样,正如评论中提到的,它也比 更可取sed 's/^M//g' file
,因为 ^ 符号是行开头的 sed 代码,因此这会删除行开头的每个 M 。我创建了一个文本文件,其中几行只有一个前导 M,并且使用该 sed 命令,除了换行符之外什么也没有作为输出。
答案4
使用sed:
sed 's/^M//g' filename > newfilename