Bash 替换多个文件中的一行,限制为行号范围
我有大量文件,我想替换所有这些文件中的一些行。我不知道这些行的确切内容,我只知道它们都包含两个已知的单词——比如“程序员”和“鲍勃”。因此,我要替换的行可能类似于:Bash 替换多个文件中的一行,限制为行号范围,bash,sed,Bash,Sed,我有大量文件,我想替换所有这些文件中的一些行。我不知道这些行的确切内容,我只知道它们都包含两个已知的单词——比如“程序员”和“鲍勃”。因此,我要替换的行可能类似于: Created by Programmer Bob Programmer extraordinaire Bob, such an awesome guy Copyright programmer bob, all rights reserved 到目前为止,这听起来很容易,但问题是我只想替换包含在某一行范围内的行,例如在文件的开头
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
进入
实际上这可能更好。(我还在find命令中添加了-I(大写字母I)标志,它跳过二进制文件。)您正在混合地址和命令。简单的替换应该有效:
find . -exec grep -il -E 'Programmer.*Bob' {} \; \
| xargs sed -i '1,10 s/.*Programmer.*Bob.*/LINE REPLACED/'
find-键入f-name“*.cpp”| xargs perl-pi-e”如果(/Programmer/&&&&&&/Bob/&&&&$.>=1&&&$.sed命令:
>sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file
我一定是有很糟糕的幻觉,因为这个答案似乎很有道理,但出于某种原因,我就是想不出来。也许我需要休息一下。:)我会试试,如果它有效的话,我会做正确的标记。谢谢
find . -type f -name "*.cpp"|xargs perl -pi -e 'if(/Programmer/ && /Bob/ && $.>=1 && $.<10){$_="line to replace"}'
>sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file