这是一个实际情况。我面对一些文件,这些文件中有一个通用字符串。我通常会打开 vi 并执行类似以下操作
:%s/text/replacement/g
我必须在许多文件中多次执行此操作。是否有一些简单的方法可以做到这一点或我可以为其创建某种别名?
答案1
您可以使用 find 查找目标文件,然后将其通过管道传输到 sed:
查找 | xargs sed -i 's/foo/bar/g'
仅在 .txt 文件中替换:
查找 . -name "*.txt" -print | xargs sed -i 's/foo/bar/g'
(从这篇博文)
答案2
啊,是的,是时候来一个 perl 单行程序了。这个怎么样?
perl -pi -e 's/old text/new text/' file
或者你想更改当前目录中的所有 *.txt 文件?在这种情况下,如何将其与GNU并行:
parallel perl -i.bak -pe 's/foo/bar/' ::: *.txt
同时:::
,将此之后的所有内容用作输入文件。
或者改变全部当前目录中的 txt 文件和以下:
find . -name \*txt -print0 | parallel -q -0 perl -i.bak -pe 's/old text/new text/'
请注意,系统-i.bak
会保存您更改的每个文件的备份,以防您犯错。如果您觉得危险,可以忽略此操作。
无论如何,sed
答案显然是标准答案,但也有一些有趣的替代方法。此外,如果您有很多文件,gnu parallel 的速度会快得多,因为它会并行运行多个副本(正如人们所希望的那样,鉴于其名称)。
答案3
检查一下 sed,类似这样:
sed -i 's/text/replacement/g' file