查找单词的第一个匹配项,并使用sed命令编辑其旁边的行

查找单词的第一个匹配项,并使用sed命令编辑其旁边的行,sed,command-line,Sed,Command Line,我有一个文件,其中包含多行中的单词“string”。我只想编辑/替换文件中第一次出现的“string”旁边的整行 我试过这个 sed-i'/string/{n;s/*/new string/1}'测试文件 但是,在其他出现“string”之后,我将获得所有其他行的更新。您可以使用以下命令: sed '/string/{n;s/.*/new_string/;:a;n;ba}' input.file 我添加了:a;Nba命令: :a # defines a label 'a' n # read

我有一个文件,其中包含多行中的单词“string”。我只想编辑/替换文件中第一次出现的“string”旁边的整行

我试过这个 sed-i'/string/{n;s/*/new string/1}'测试文件

但是,在其他出现“string”之后,我将获得所有其他行的更新。您可以使用以下命令:

sed '/string/{n;s/.*/new_string/;:a;n;ba}' input.file
我添加了
:a;Nba
命令:

:a # defines a label 'a'
n  # read next line of input
ba # branch (jump) to label a

这实际上是一个循环,通过剩余的行,直到文件的末尾,该文件将打印所有未更改的剩余行。

我将使用
ed
而不是
sed

ed-s测试文件这可能适合您(GNU-sed):

使用保留空间作为标志,如果设置了,则缩短任何进一步的处理


注意:
sed-e'/string/{N;c new_string'-e':a;N;ba}'文件
可能看起来有效,但会引入错误(请参阅@hek2mgl solution中的注释).

sed
是一个糟糕的工具选择,但是你对你提出的问题有了答案,所以如果你想找到更好的方法,那么请提出一个新问题,这次用
awk
标记它。值得指出的是,通常习惯用语
s/*/replacement/
会建议
c replacement
,但是,
c
命令的作用方式与
d
相同,并且该循环不再执行其他命令。因此,
:a;Nba
永远不会到达命令集,文件中的其他行可能会被替换。
sed 'x;/./{x;b};x;/string/!b;h;n;c new_string' file