我有大量文件,我想替换所有这些文件中的一些行。我不知道这些行的确切内容,我所知道的只是它们都包含两个已知的单词 - 例如“程序员”和“鲍勃”。所以我想替换的行可能是这样的:
Created by Programmer Bob
Programmer extraordinaire Bob, such an awesome guy
Copyright programmer bob, all rights reserved
到目前为止,这听起来很容易,但问题是我只想替换包含在行范围内的行 - 例如在文件的开头(通常会在其中找到有关文件的注释)。我无法替换文件后面部分中的行,因为我不想意外替换实际代码。
到目前为止,我已经尝试过:
find . -exec grep -il -E 'Programmer.*Bob' {} \; | xargs sed -i '1,10 /Programmer.*Bob/Ic\LINE REPLACED'
(我使用 find 是因为 grep 遇到了无限递归 - 我认为。不是这里的重点。)
但是,我似乎不能将地址范围与 c\ (换行)一起使用。随意指出任何语法错误,但我想我已经尝试了一切都无济于事。这在没有行号的情况下确实有效。
编辑:我得到了答案,但我决定编辑我的问题以包括我的解决方案,该解决方案扩展了我得到的答案 - 也许有人会觉得这很有帮助。
后来我意识到我想在行首保留可能的空格和注释字符。我使用以下命令完成了它:
find . -exec grep -ilI '.*Programmer.*Bob.*' {} \; xargs sed -i -r '1,10 s/([ \t#*]*)(.*Programmer.*Bob.*)/\1LINE REPLACED/I'
\1 保留匹配 [ \t#*]* 的模式。可以将其更改为 ^[ \t#*]* 将模式锚定到行首,但是(我认为)当前版本会改变
** Text I don't want to remove ** Programmer Bob
进入
** Text I don't want to remove ** LINE REPLACED
这实际上可能会更好。(我还在 find 命令中添加了 -I(大写 i)标志,它会跳过二进制文件。)