0

我有大量文件,我想替换所有这些文件中的一些行。我不知道这些行的确切内容,我所知道的只是它们都包含两个已知的单词 - 例如“程序员”和“鲍勃”。所以我想替换的行可能是这样的:

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)标志,它会跳过二进制文件。)

4

3 回答 3

0

您正在混合地址和命令。简单的替换应该有效:

find . -exec grep -il -E 'Programmer.*Bob' {} \; \
    | xargs sed -i '1,10 s/.*Programmer.*Bob.*/LINE REPLACED/'
于 2013-05-21T08:19:26.907 回答
0

sed 命令:

 >sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file
于 2013-05-21T08:57:41.803 回答
0
find . -type f -name "*.cpp"|xargs perl -pi -e 'if(/Programmer/ && /Bob/ && $.>=1 && $.<10){$_="line to replace"}'
于 2013-05-21T08:40:48.283 回答