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

问题描述:

我在一个web根目录下有一组文件,它们都包含我想删除的特殊字符(Â,€,â等)。Unix查找替换多个文件中的特殊字符

我的命令

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

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

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

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

有什么想法?

+0

我也许应该澄清。我正在寻找的结果是从特殊字符当前所在的所有文件中删除特殊字符。 – Schoffelman 2009-12-10 18:11:49

+0

这就是你在原始问题的第一句话中所说的内容。我的问题是你的'tr'命令与你期望的有什么不同? – 2009-12-10 18:15:11

+0

是的,在我运行tr -d命令并重新运行第一个find命令后,它仍然会返回相同的结果,而我想删除每个结果。 – Schoffelman 2009-12-10 21:08:35

全部更换非ASCII字符在当前目录下的所有文件,你可以使用:

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

事后你必须找到并删除所有“.bak的”文件:

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

使用

tr -d 'Â' 

什么是'代表什么吗?在我的系统上使用你的命令产生这个错误:

tr: extra operand `'

Only one string may be given when deleting without squeezing repeats.

Try `tr --help' for more information.

+0

''只是把字符放在引号中,用什么都没有替换掉 – Schoffelman 2009-12-10 16:42:47

+0

tr -d''只是删除,我认为没关系,你需要什么,或者我错过了什么? – 2009-12-10 16:52:53

+0

nope,删除就好了 – Schoffelman 2009-12-10 16:54:20

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

所以,你可以使用命令:

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

我有一个简单的例子测试这一点,它似乎工作。 -exec应该处理名称中带有空格的文件,但可能还有其他我不知道的漏洞。

+0

我能够得到这个与一些额外的标志 找到工作。 -type'f -name'*。*'-exec sed -i“s/// gi”{} \; – Schoffelman 2009-12-17 17:09:50

sed 's/ø//' file.txt 

这应该做的伎俩用一个空字符串替换一个特殊的字符。

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

无用的猫 - sed's /ø//'file.txt – ghostdog74 2009-12-10 23:21:54

+0

谢谢,现在修复。 – 2009-12-10 23:39:34

我会使用类似这样的东西。

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 
+0

有空格的文件中断。 – ghostdog74 2009-12-10 23:21:18

+0

好的,没想到有人在Linux环境中使用文件名中的空格。但你是对的,这是一个点。我会在我的帖子中添加更正。 – user224243 2009-12-11 22:31:30

这将有助于了解“不会产生我正在寻找的结果”的含义。但是,您的命令tr未提供要处理的文件名。您可以将其更改为:

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

哪一个将输出所有内容到标准输出。您可能想要修改文件。您可以使用Grundlefleck的答案,但在答案中提到的问题之一是如果有大量文件。你可以这样做:

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

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

+0

对不起,我正在寻找的结果是删除了特殊字符。 – Schoffelman 2009-12-10 18:08:36

+0

对于Grundlefleck和上述解决方案,我得到一个 sed:1:“./index.html”:无效的命令代码。 检查是否有需要更改的系统/环境设置 - 但我不认为这就是它 – Schoffelman 2009-12-15 17:43:33

与bash shell的

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

我会努力为好的“技巧”(但它不是一个关于移动文件的问题)。 – 2009-12-22 21:43:31