Unix查找替换多个文件中的特殊字符

时间:2009-12-10 16:23:29

标签: unix shell replace find

我在网络根目录中有一组文件,其中包含我想删除的特殊字符(Â,€,â等)。

我的命令

find . -type f -name '*.*' -exec grep -il "Â" {} \;

发现&列出文件就好了,但我的命令

find . -type f -name '*.*' -exec tr -d 'Â' '' \;

不会产生我正在寻找的结果。

有什么想法吗?

7 个答案:

答案 0 :(得分:4)

替换您可以使用的当前目录中所有文件中的所有非ascii 字符:

find . -type f | xargs perl -pi.bak -e 's,[^[:ascii:]],,g'

之后你必须找到并删除所有'.bak'文件:

find . -type f -a -name \*.bak | xargs rm

答案 1 :(得分:3)

我建议调查sed。它可以用来替换文件的内容。

所以你可以使用命令:

find . -type f -name '*.*' -exec sed -i "s/Â//" {} \;

我用一个简单的例子对此进行了测试,似乎有效。 -exec应该处理名称中带有空格的文件,但可能还有其他我不知道的漏洞。

答案 2 :(得分:2)

使用

tr -d 'Â' 

''代表什么?在我的系统上使用您的命令会产生此错误:

  

tr:额外的操作数`'

     

删除时不能重复删除,只能给出一个字符串。

     

尝试`tr --help'获取更多信息。

答案 3 :(得分:1)

sed 's/ø//' file.txt

这应该是用空字符串替换特殊字符的技巧。

find . -name "*.*" -exec sed 's/ø//' {} \

答案 4 :(得分:0)

我会用这样的东西。

for file in `find . -type f`
do
    # Search for char end remove it. Save file as file.new
    sed -e 's/[ۉ]//g' $file > $file.new
    # mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE
    mv $file.new $file
done

上面的脚本会失败,因为levislevis85用文件名中的空格提到它。如果您使用以下代码,则不会出现这种情况。

find . -type f | while read file
do 
    # Search for char end remove it. Save file as file.new
    sed -e 's/[ۉ]//g' "$file" > "$file".new
    # mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE
    mv "$file".new "$file"
done

答案 5 :(得分:0)

知道什么“不能产生我正在寻找的结果”是有帮助的。但是,在您的命令tr中未提供要处理的文件名。您可以将其更改为:

find . -type f -name '*.*' -exec tr -d 'Â' {} \;

将把所有内容输出到stdout。您可能希望修改文件。您可以使用 Grundlefleck 的答案,但该答案中提到的问题之一是文件是否有大量问题。你可以这样做:

find . -type f -name '*.*' -print0 | xargs -0 -I{} sed -i "s/Â//" \{\}

应处理名称中包含空格的文件以及大量文件。

答案 6 :(得分:0)

使用bash shell

for file in *.*
do
  case "$file" in 
   *[^[:ascii:]]* )
         mv "$file" "${file//[^[:ascii:]]/}"
   ;;
  esac
done