sed - 跨多个文件删除某些字符串的部分

sed - Remove parts of certain strings across multiple files

从教程 here 中,我学会了从 Linux 命令行查找和替换多个文件中的文本。例如,

find . -name "*.php" -print | xargs sed -i 's/foo/bar/g'

在以“.php”结尾的文件中查找 'foo' 的所有实例,并将这些实例替换为 'bar'.

现在假设我多次重复出现类似 assert something.makeAssertion 的内容,我只想用 something.makeAssertion 替换它。鉴于 something 可能会有所不同,我该如何调整脚本呢?我用 $ 尝试了一些东西来捕获 something 作为变量(?),但还没有弄清楚。

从表面上看,您可以使用:

find . -name '*.php' -exec \
    sed -i.bak -e 's/assert\(.*\.makeAssertion\)//g' {} +

当行后面有 .makeAssertion 时,正则表达式会删除 assertfind … -exec 在它找到的文件上运行 sed+ 表示 'group a convenient number of files into a single command line',很像 xargs,但没有一些复杂性。使用 GNU findxargs 的替代方案是:

find . -name '*.php' -print0 |
    xargs -0 sed -i.bak -e 's/assert\(.*\.makeAssertion\)//g'

这两者都避免了文件名中的空格或换行符问题。