我在做一些应该相当简单的事情时遇到了一些麻烦。我想象它会这样工作:
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)
虽然用处不大,但相关的是,您还可以将多个-exec
s 串在一起;它们从左到右执行。
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' {} ';'
%
选择所有行s
代替g
全局替换x
保存并关闭