搜索模式(如果存在)然后替换整行,否则使用 SED 命令在另一个模式后插入新行

搜索模式(如果存在)然后替换整行,否则使用 SED 命令在另一个模式后插入新行

我正在尝试编写一个非常简单的单行 SED 命令,该命令不使用bash conditions.

对于执行类似操作但附加到文件末尾的 SED 命令,我使用以下命令:

sed -n -e '/.*MYLINE.*/!p' -e '$aVAR=MYLINE' -i /path/to/file

但这一次,插入行的位置很关键,因此它应该位于特定字符串之后。我尝试了以下操作:

sed -n -e '/.*MYLINE.*/!p' -e t -i '/^ANOTHER_PATTERN.*/aVAR=MYLINE' /path/to/file

这样我就可以/path/to/file从这个转向

...
ANOTHER_PATTERN=SOMETHING
...

或者这个

...
ANOTHER_PATTERN=SOMETHING
VAR=OTHERS MYLINE
...

来生产这个

...
ANOTHER_PATTERN=SOMETHING
VAR=MYLINE
...

然而,它并没有产生预期的结果。我尝试谷歌搜索但无济于事。

如何正确搜索模式(如果存在)然后替换整行,否则使用 SED 在另一个模式后插入新行?

答案1

sed -e '/MYLINE/d' -e '/^ANOTHER_PATTERN/a\
VAR=MYLINE' file

如果该行包含模式,则会将其删除MYLINE,并将该行附加VAR=MYLINE到以模式开头的行ANOTHER_PATTERN。添加选项-i以就地编辑文件(如果您的sed实现支持)。

答案2

使用awk

awk '/MYLINE/{next}; 
/^ANOTHER_PATTERN/{$0 = $0 ORS "VAR=MYLINE";}1' input

表达后/MYLINE/{next}不采取进一步行动。实际上,当awk使用 s 1 打印惯用语时,这会阻止打印记录。如果找到另一个模式,则当前输入 record( $0) 更改为$0后跟换行符,然后后跟VAR=MYLINE

相关内容