Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 替换多个文件中的一行,限制为行号范围_Bash_Sed - Fatal编程技术网

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