遍历一堆文件并搜索/替换文本的最佳方法是什么?

遍历一堆文件并搜索/替换文本的最佳方法是什么?

我在做一些应该相当简单的事情时遇到了一些麻烦。我想象它会这样工作:

find . -name *.txt -exec sed 's/oldtext/newtext/g' {} > tmp \\; mv tmp {} \;

不幸的是,我无法 sed 一个文件并转储到其自身。但我不知道如何转储到临时文件,然后立即 mv 该文件。我知道 \\; 是错误的,但我不知道如何先运行一个命令,然后再运行另一个命令。

答案1

请参阅-i中的选项man sed

-i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if extension supplied)

虽然用处不大,但相关的是,您还可以将多个-execs 串在一起;它们从左到右执行。

tmp=$(tempfile)
find . -name '*.txt' -exec sed 's/oldtext/newtext/g' '{}' > $tmp \; -exec mv $tmp '{}' \;

(请注意 的引用和 的转义*.txt,以免它们被你的 shell 解释。){};

答案2

你可以在 Ex 模式下使用 Vim:

find -name '*.txt' -exec ex -sc '%s/OLD/NEW/g|x' {} ';'
  1. %选择所有行

  2. s代替

  3. g全局替换

  4. x保存并关闭

相关内容