递归删除尾随字符

时间:2013-11-08 16:54:11

标签: solaris vi

我只是将几个文件从windows复制到unix,最后它们都有^M。我知道如何使用vi删除它们,但我一次只能执行一个文件,有没有办法可以对文件夹中的所有文件执行此操作?有60个文件,并且手动执行所有这些文件非常耗时!

我也愿意使用其他工具!

PS:操作系统是Solaris

由于

3 个答案:

答案 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)

如果您的计算机上没有dos2unixdtou命令,则可以使用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