我只是将几个文件从windows复制到unix,最后它们都有^M
。我知道如何使用vi删除它们,但我一次只能执行一个文件,有没有办法可以对文件夹中的所有文件执行此操作?有60个文件,并且手动执行所有这些文件非常耗时!
我也愿意使用其他工具!
PS:操作系统是Solaris
由于
答案 0 :(得分:2)
对于后人,让我们从VI中发布解决方案。您可以在每行的末尾删除 Ctrl - M ,如下所示:
:%s/^V^M$//
请注意,这是输入的内容,wnere ^V
表示 Ctrl - V ,^M
表示< KBD>控制 - 中号。这里的想法是^V
将“逃避”以下^ M,以便您可以在替换正则表达式中匹配它。
%
表达式意味着“在每一行都这样做”。
请注意,这可能在vim中有效,也可能无效,具体取决于您的设置。
但是您的问题询问如何在vi中执行此操作,您无法轻松地对多个文件进行更改。如果您愿意使用其他工具,请在您的问题中注明。
您可以在单个文件或流上使用sed:
$ printf 'one\r\ntwo\r\n' > /tmp/test.txt
$ od -c < /tmp/test.txt
0000000 o n e \r \n t w o \r \n
0000012
$ sed -i'' -e 's/^M$//' /tmp/test.txt
$ od -c < /tmp/test.txt
0000000 o n e \n t w o \n
0000010
$
在这种情况下,在FreeBSD的/ bin / sh中,我通过......你猜对了......使用^M
来逃避^V
。
使用sed的-i
选项时,您可以指定多个文件,并且它们都将在适当的位置进行修改,可能无需将其包装在脚本中。如果你想把它放到一个脚本中,我建议你尝试这样做,然后在它不起作用时寻求帮助。这就是StackOverflow方式。 : - )
或者只使用Jonathan的for循环示例。您不需要临时文件。
<强>更新强>
如果您的sed
没有-i
选项,那么您仍然可以在for循环中轻松完成此操作:
[ghoti@pc ~]$ od -c /tmp/test1.txt
0000000 o n e \r \n t w o \r \n
0000012
[ghoti@pc ~]$ for f in /tmp/test*.txt; do sed -e 's/^M$//' "$f" > /tmp/temp.$$ && mv -v /tmp/temp.$$ "$f"; done
/tmp/temp.26687 -> /tmp/test1.txt
/tmp/temp.26687 -> /tmp/test2.txt
[ghoti@pc ~]$ od -c /tmp/test1.txt
0000000 o n e \n t w o \n
0000010
答案 1 :(得分:1)
如果您的计算机上没有dos2unix
或dtou
命令,则可以使用tr
代替:
for file in "$@" # LIst of files passed as argument to script
do
tr -d '\015' < "$file" > tmp.$$
cp tmp.$$ "$file"
done
rm tmp.$$
如果中断,可以在其周围添加trap
命令进行清理。使用cp
代替mv
会保留所有者,权限,符号链接,硬链接。
答案 2 :(得分:0)
使用命令dos2ux
。
dos2ux file >file2