\r
在Unix中从文件中删除所有回车的最简单方法是什么?
我会假设你的意思回车(CR,"\r"
,0x0d
在)两端线,而不是在文件中只是一味的(你可以有他们在字符串的中间为我所知道的).CR仅在第一行末尾使用此测试文件:
$ cat infile hello goodbye $ cat infile | od -c 0000000 h e l l o \r \n g o o d b y e \n 0000017
dos2unix
如果它安装在你的系统上,那就是要走的路:
$ cat infile | dos2unix -U | od -c 0000000 h e l l o \n g o o d b y e \n 0000016
如果由于某种原因dos2unix
无法使用,那么sed
将会这样做:
$ cat infile | sed 's/\r$//' | od -c 0000000 h e l l o \n g o o d b y e \n 0000016
如果出于某种原因sed
无法使用,那么ed
将以复杂的方式进行:
$ echo ',s/\r\n/\n/ > w !cat > Q' | ed infile 2>/dev/null | od -c 0000000 h e l l o \n g o o d b y e \n 0000016
如果您的盒子上没有安装任何这些工具,那么您遇到的问题比尝试转换文件要大:-)
tr -d '\r' < infile > outfile
见tr(1)
老套:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
有一个名为dos2unix的实用程序存在于许多系统上,并且可以在大多数系统上轻松安装.
在我看来,Linux上最简单的方法是:
sed -i 's/\r$//g'
该强引号周围的替换操作's/\r//'
是必不可少的.如果没有它们,shell将解释\r
为escape + r并将其缩小为plain r
,并删除所有小写r
.这就是为什么Rob在2009年给出的答案不起作用的原因.
并且添加/g
修饰符可确保即使是多个\r
也将被删除,而不仅仅是第一个.
sed -i s/\r//
或某些; 看到man sed
或网上有关使用的丰富信息sed
.
有一点需要指出的是上述"回车"的确切含义; 如果你真的是指单个控制字符"回车",那么上面的模式是正确的.如果你的意思更一般地说是CRLF(回车和换行,这是在Windows下实现换行的方式),那么你可能想要替换它\r\n
.Linux/Unix中的裸线馈送(换行符)是\n
.
如果您是Vi用户,则可以打开该文件并删除回车符:
:%s/\r//g
或者
:1,$ s/^M//
请注意,您应该按ctrl-v然后按ctrl-m键入^ M.
再一次解决方案...因为总有一个解决方案:
perl -i -pe 's/\r//' filename
这很好,因为它已经到位并适用于我曾经使用过的unix/linux的各种风格.