【问题标题】:Unix Find Replace Special Characters in Multiple FilesUnix查找替换多个文件中的特殊字符
【发布时间】:2010-12-25 07:52:52
【问题描述】:

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

我的命令

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

查找并列出文件就好了,但是我的命令

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

没有产生我想要的结果。

有什么想法吗?

【问题讨论】:

  • 我应该澄清一下。我正在寻找的结果是从特殊字符当前所在的所有文件中删除特殊字符。
  • 这就是您在原始问题的第一句话中所说的。我的问题是您的 tr 命令与您的预期有何不同?
  • 是的,在我运行 tr -d 命令然后重新运行第一个 find 命令后,它仍然会返回相同的结果,而我想删除每个结果。
  • 您的sed 是否有-i(就地)选项?如果不是,那可能是错误的根源。

标签: unix shell replace find


【解决方案1】:

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

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

之后您必须找到并删除所有“.bak”文件:

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

【讨论】:

    【解决方案2】:

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

    所以你可以使用命令:

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

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

    【讨论】:

    • 我能够让这个与一些额外的标志一起工作 find 。 -type f -name '.' -exec sed -i "s/Â//gi" {} \;
    【解决方案3】:

    使用

    tr -d 'Â' 
    

    “”代表什么?在我的系统上使用你的命令会产生这个错误:

    tr: 额外的操作数 `'

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

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

    【讨论】:

    • '' 只是将字符放入引号中,将其替换为空
    • tr -d 'Â' 只是删除,我认为它可以满足您的需求,还是我遗漏了什么?
    【解决方案4】:
    sed 's/ø//' file.txt
    

    这应该可以用空字符串替换特殊字符。

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

    【讨论】:

    • 无用的cat --sed 's/ø//' file.txt
    【解决方案5】:

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

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

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

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

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

    【讨论】:

    • 对不起,我正在寻找的结果是删除特殊字符。
    • 使用 Grundlefleck 和上面的解决方案,我得到一个 sed: 1: "./index.html": invalid command code 。检查我是否有需要更改的系统/环境设置 - 但我不认为就是这样
    【解决方案6】:

    使用 bash 外壳

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

    【讨论】:

    • 我会赞成这个不错的“技巧”(但这不是关于移动文件的问题)。
    【解决方案7】:

    我会使用这样的东西。

    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
    

    【讨论】:

    • 好吧,没想到有人在linux环境下的文件名中使用了空格。但你说得对,这是一个重点。我将对我的帖子进行更正。
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多