【问题标题】:List the files in which i'm replacing with sed列出我用 sed 替换的文件
【发布时间】:2014-11-05 23:21:35
【问题描述】:

我有命令

find . -type f \( ! -name "*.png" \) -print0 | \
xargs -0 sed -i 's#word#replace#g'

awk/sed: How to do a recursive find/replace of a string?
BASH: recursive program to replace text in a tree of files

到目前为止,此命令有效,但我想显示 sed 替换文本的文件。 是否有一些参数允许这样做?

【问题讨论】:

    标签: replace sed


    【解决方案1】:

    您可以同时使用 print 和 exec 选项并打印出它处理的文件:

    find . -type f \( ! -name "*.png" \) -print -exec sed -i 's#word#replace#g' {} \; 2>/dev/null

    【讨论】:

      【解决方案2】:

      您缺少 cmp 来比较更改前后的两个文件。您可以尝试以下几行:

      find . -type f \( ! -name "*.png" \) -exec sh -c 'sed "s/word/replace/g" $0 > $0.$$; if ! cmp $0.$$ $0; then echo $0; mv $0.$$ $0; else rm $0.$$; fi' {} \;
      
      • find - 在当前目录中所有文件名不是*.png
      • exec - sed 在 find 命令找到的文件中用替换词搜索和替换词,并将其放入由进程 ID 附加的临时文件中
      • if !cmp 语句 - 比较新旧文件,如果它们不同,则打印文件名以及输出,最后将临时文件移动到原始文件,如果它们不同,则删除临时文件。

      【讨论】:

        【解决方案3】:

        我不知道您在哪个平台上,但这是可能的。更改您的 xargs 以运行 shell,以便您可以执行多个命令,然后在该 shell 中测试该文件是否比您在开始时创建的任意文件更新 - 即它已更改

        touch /tmp/go
        find ... | xargs ... -I % sh -c 'sed "%"; [ "%" -nt /tmp/go ] && echo %'
        

        【讨论】:

          猜你喜欢
          • 2022-10-21
          • 2021-11-16
          • 1970-01-01
          • 2020-03-07
          • 2014-12-22
          • 2018-10-14
          • 1970-01-01
          • 2015-09-01
          相关资源
          最近更新 更多