Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix查找并替换多个文件中的特殊字符_Unix_Shell_Replace_Find - Fatal编程技术网

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

Unix查找并替换多个文件中的特殊字符,unix,shell,replace,find,Unix,Shell,Replace,Find,我在web根目录中有一组文件,它们都包含我想删除的特殊字符(如、€、等等) 我的命令 find . -type f -name '*.*' -exec grep -il "Â" {} \; 查找并列出文件很好,但是我的命令 find . -type f -name '*.*' -exec tr -d 'Â' '' \; 不会产生我想要的结果 有什么想法吗?使用 tr -d 'Â' “”代表什么?在我的系统上,使用您的命令会产生以下错误: tr:额外操作数`' 删除而不压缩重复时只能给出一

我在web根目录中有一组文件,它们都包含我想删除的特殊字符(如、€、等等)

我的命令

find . -type f -name '*.*' -exec grep -il "Â" {} \;
查找并列出文件很好,但是我的命令

find . -type f -name '*.*' -exec tr -d 'Â' '' \;
不会产生我想要的结果

有什么想法吗?

使用

tr -d 'Â' 
“”代表什么?在我的系统上,使用您的命令会产生以下错误:

tr:额外操作数`'

删除而不压缩重复时只能给出一个字符串

有关详细信息,请尝试“tr--help”


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

因此,您可以使用以下命令:

find . -type f -name '*.*' -exec sed -i "s/Â//" {} \;
我用一个简单的例子对此进行了测试,它似乎是有效的。
-exec
应该处理名称中带有空格的文件,但可能存在我不知道的其他漏洞

sed 's/ø//' file.txt
这样就可以用空字符串替换特殊字符了

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

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

find . -type f | xargs perl -pi.bak -e 's,[^[:ascii:]],,g'
之后,您必须查找并删除所有“.bak”文件:

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

我会用这样的东西

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
上面的脚本将失败,因为Levisle85在文件名中提到了它,其中包含空格。如果使用下面的代码,情况就不是这样了

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

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

find . -type f -name '*.*' -exec tr -d 'Â' {} \;
它会将所有内容输出到stdout。您可能希望改为修改文件。您可以使用Grundlefleck的答案,但该答案中提到的一个问题是是否存在大量文件。您可以这样做:

find . -type f -name '*.*' -print0 | xargs -0 -I{} sed -i "s/Â//" \{\}
它应该处理名称中带有空格的文件以及大量文件。

使用bash shell

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

“”只是将字符置于引号中,将其替换为nothingtr-d'just deletes,我认为这与您需要的内容相符,还是我遗漏了什么?抱歉,我正在寻找的结果是删除特殊字符。使用Grundlefleck和上述解决方案,我得到一个sed:1:“./index.html”:无效的命令代码。检查我是否有需要更改的sys/environment设置,但我认为这不是itI应该澄清的。我想要的结果是将特殊字符从当前驻留的所有文件中删除。这是您在原始问题的第一句中所说的。我的问题是,您的
tr
命令与您期望的有什么不同?是的,在我运行tr-d命令,然后重新运行第一个find命令后,它仍然会返回相同的结果,而我希望删除每个结果。您的
sed
是否具有
-I
(就地)选项?如果不是,那可能是错误的根源。cat--sed's/ø/'file.txtook的无用用法,认为在linux环境中没有人在文件名中使用空格。但你说得对,这是一个问题。我将在我的帖子中添加一个更正。我可以通过一些额外的标记找到这篇文章-键入f-name'.-exec sed-i“s/g//gi”{}\;我会投赞成票的好“把戏”(但这不是一个关于移动文件的问题)。