我正在尝试编写一个非常简单的单行 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
。