在Unix中从文件中删除所有回车\r的最简单方法是什么?
当前回答
我将假设您是指行尾的回车符(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
如果你没有在你的盒子上安装任何这些工具,你有比试图转换文件更大的问题:-)
其他回答
这又是一个解决方案……因为总还有一个问题:
perl -i -pe 's/\r//' filename
它很好,因为它可以在我使用过的所有unix/linux版本中工作。
事情是这样的,
%0d是回车字符。使它与Unix兼容。我们需要使用下面的命令。
dos2unix fileName。extension fileName.extension
有一个名为dos2unix的实用程序存在于许多系统上,并且可以在大多数系统上轻松安装。
虽然这是一篇较老的文章,但最近我遇到了同样的问题。因为我有所有的文件重命名/tmp/blah_dir/,因为这个目录中的每个文件都有“/r”结尾字符(在文件末尾显示“?”),所以做脚本的方式是我唯一能想到的。
我想保存具有相同名称的最终文件(不拖尾任何字符)。 对于sed,问题是输出文件名,我需要提到其他东西(我不想要)。
我尝试了这里建议的其他选项(由于某些限制,不考虑dos2unix),但没有成功。
我尝试了“awk”,最后我使用“\r”作为分隔符,并采取了第一部分:
技巧是:
echo ${filename}|awk -F"\r" '{print $1}'
下面的脚本片段我用(我有所有文件有“\r”作为结尾字符在路径/tmp/blah_dir/)来解决我的问题:
cd /tmp/blah_dir/
for i in `ls`
do
mv $i $(echo $i | awk -F"\r" '{print $1}')
done
注:这个例子不是很精确,但接近我的工作(这里提到只是为了更好地了解我所做的工作)
我制作了这个shell脚本来删除\r字符。它适用于solaris和red-hat:
#!/bin/ksh
LOCALPATH=/Any_PATH
for File in `ls ${LOCALPATH}`
do
ARCACT=${LOCALPATH}/${File}
od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
rm ${ARCACT}.TMP
done
exit 0