我从某些文件中删除了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可以正常工作。如果我的列表文件不好,我希望至少会抛出一个错误代码...
答案 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>