将DOS ^ M char转换为Unix格式失败

时间:2015-11-09 16:06:38

标签: bash sed

我从某些文件中删除了DOS ^ M字符。如果我在一个文件上运行此sed行,它将按预期删除字符:

$ sed -i 's/^M//g' somefile.txt

但是,如果我在一个for循环中从文件列表中拉出相同的行,它就不起作用:

$ for i in `cat list`; do sed -i 's/^M//g' $i; done

请注意,我可以应用其他命令而不是sed,它们按顺序在每个文件上按预期执行。此外,不会抛出任何错误(甚至代码都没有,因为echo $?返回0)。我也试过引用$ i。

根据评论中的建议,我尝试了dos2unix:

$ for i in `cat list`; do dos2unix $i; done

但没有任何改变。直接在单个文件上使用dos2unix可以正常工作。如果我的列表文件不好,我希望至少会抛出一个错误代码...

2 个答案:

答案 0 :(得分:2)

首先,我不认为sed了解^M回车。它应该是\r

此外,由于UNIX中的文件名可以包含bash的默认字段分隔符,我建议使用while-read循环:

while read -r file ; do
    sed -i 's/\r//' "$file"
done < list

上面的循环读取逐行。但是,由于文件本身也可以包含新行字符,因此最好使用find动态生成列表并使用它-exec选项:

find PATH_TO_FILES -type f -name 'NAME' ... -exec sed -i 's/\r//' {} \;

顺便说一下,g选项在sed命令中没有意义,因为\r每行只出现一次。这就是为什么我省略了它。

答案 1 :(得分:0)

答案是我在运行命令时输入^ M字符并不够小心。正如SO上的其他帖子所解释的那样,有必要输入ctrl-v,ctrl-m来输入^ M作为单个控制字符。

我的问题是,我认为如果我最初以这种方式进入,那么在此之后突出显示并粘贴它是好的,但对于我正在使用的终端模拟器(guake,tmux),情况并非如此。 / p>