转换行尾符

74

我一直使用d2u来转换行尾。安装了Puppy Linux后,我注意到它没有d2u,而是dos2unix。接着我发现Ubuntu默认都没有这两个。

有没有其他的方法可以转换行尾呢?

2个回答

124

一些选项:

使用 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

8
只有这个在我的 Mac 上能够起作用:tr -d '\r' < windows.txt > unix.txt。该命令的作用是将 windows.txt 文件中的所有回车符 \r 删除,并将结果输出到名为 unix.txt 的新文件中。 - Davoud Taghawi-Nejad
2
我在 Mac 上学到,你不能使用 tr 打开并写入同一个文件。这会导致一个空白文件,但是将其写入不同的名称则非常好! - Loren
2
@Loren 我认为这应该是你在任何重定向中的假设。目标文件在读取源文件之前被打开。一些命令允许您执行“原地”操作,例如sed-i,但仍然使用中间/备份文件。 - nhed
这些答案通常是正确的,你可以添加 awk '{sub(/\r$/,"")}1' windows.txt > unix.tx,但请注意,tr 会从输入中删除 所有\r,而不仅仅是像 perl、sed 和现在的 awk 脚本那样出现在每行末尾的 \r - Ed Morton
1
将标准输出和标准输入在同一行重定向有点让我感到困惑,所以我使用了以下命令:cat windows_newlines.txt | tr -d '\r' > unix_newlines.txt - jocassid
tr -d '\15\32' 在Ubuntu18中工作。 - Samuel

73

使用POSIX来做这件事情有些棘手:

  • POSIX Sed 不支持 \r\15。即使支持,原地替换选项-i也不是POSIX标准

  • POSIX Awk 支持 \r\15,但 -i inplace 选项不是POSIX标准

  • d2udos2unix 不是POSIX实用程序,但ex是POSIX标准

  • 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

那些awk脚本仅适用于GNU awk,因为多字符RS(RS中有多个字符会在POSIX中引发未定义的行为,因此某些POSIX awks将默默删除$并保留仅^,而其他一些则可执行其他操作),当getline失败时,它们将产生意外结果,它们仅会处理输入的第一行,并且在某些情况下会破坏输入文件。如果修复后要处理所有行,则会在其他行中通过向正在读取的输入文件写入而导致无限循环。请勿执行这些脚本。 - Ed Morton
3
这项工作在同一文件上进行,即直接替换原有的行尾。而tr解决方案则需要将输出写入不同的文件。 - PeterM
1
sed或tr对我不起作用。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接