Unix查找并替换多个文件中的特殊字符
我在web根目录中有一组文件,它们都包含我想删除的特殊字符(如、€、等等) 我的命令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:额外操作数`' 删除而不压缩重复时只能给出一
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”{}\;我会投赞成票的好“把戏”(但这不是一个关于移动文件的问题)。