【发布时间】:2013-05-22 01:12:45
【问题描述】:
我一直在使用d2u 来转换行尾。安装 Puppy Linux 后,我
注意到它没有附带d2u,而是dos2unix。然后我注意到
Ubuntu 默认情况下两者都缺失。
另一种转换行尾的方法是什么?
【问题讨论】:
标签: bash shell sed command-line dos2unix
我一直在使用d2u 来转换行尾。安装 Puppy Linux 后,我
注意到它没有附带d2u,而是dos2unix。然后我注意到
Ubuntu 默认情况下两者都缺失。
另一种转换行尾的方法是什么?
【问题讨论】:
标签: bash shell sed command-line dos2unix
一些选项:
tr
tr -d '\15\32' < windows.txt > unix.txt
或
tr -d '\r' < windows.txt > unix.txt
perl
perl -p -e 's/\r$//' < windows.txt > unix.txt
sed
sed 's/^M$//' windows.txt > unix.txt
或
sed 's/\r$//' windows.txt > unix.txt
要获得^M,您必须输入CTRL-V,然后输入CTRL-M。
【讨论】:
tr -d '\r' < windows.txt > unix.txt
sed 的-i 那样“就地”执行,但无论如何都要使用中间/备份文件
awk '{sub(/\r$/,"")}1' windows.txt > unix.tx 但请注意,tr 正在从输入中删除 all \rs,而不仅仅是那些出现在每一行的末尾,就像 perl、sed 和现在的 awk 脚本一样。
cat windows_newlines.txt | tr -d '\r' > unix_newlines.txt
用 POSIX 做这件事很棘手:
POSIX Sed 不支持\r 或\15。即使这样做了,原地
选项 -i 不是 POSIX
POSIX Awk 确实支持\r 和\15,但是-i inplace 选项
不是POSIX
d2u 和 dos2unix 不是 POSIX utilities,但 ex 是
POSIX ex 不支持\r、\15、\n 或\12
删除回车:
awk 'BEGIN{RS="^$";ORS="";getline;gsub("\r","");print>ARGV[1]}' file
添加回车:
awk 'BEGIN{RS="^$";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
【讨论】:
$ 并仅保留 @ 987654338@,其他人可以为所欲为),当getline失败时会产生意想不到的结果,它们只会对输入的第一行进行操作,并且在某些情况下会破坏输入文件,如果他们是固定在所有行上操作会在读取输入文件时写入输入文件,从而导致其他人出现无限循环。不要不执行这些脚本。
tr 解决方案需要不同的文件作为输出。