sed 替换不以 # 开头的匹配行

sed 替换不以 # 开头的匹配行

我有一个名为“测试文件”的文件。它只有以下两行(前一行带有#号,第二行内容相同但没有哈希):

#contents of line
contents of line

我想使用 sed 命令更新/替换第二行的内容。我知道它的简单语法,例如:

sed -i 's/.*contents of line.*/updated contents/' test-file

但上面的命令正在替换这两行,而我不想用前面的 # 符号更新第一行。

答案1

您可以通过以下方式进行编辑:

sed -e '/^#/!s/.*/UPDATED_CONTENTS/' input-file.txt

或者

sed -e '/^#/!c\
UPDATED_CONTENTS' input-file.txt

这可以理解为:对于任何不以 开头的行#,将整行更改为指定的内容。

如果您担心 octothorpe 前面可能有空格,请调整正则表达式,/^[[:blank:]]*#/同时保持其余部分不变。

答案2

尝试

sed 's/^[^#]*contents of line.*/updated contents/' test-file

或者以行锚点开头^,并且您知道该行以 开头content ...,您可以这样做:

sed 's/^contents of line.*/updated contents/' test-file

如果您知道要更新哪一行,则可以直接更改其地址行号,例如。

sed '2s/.*/updated content/' test-file

-i当您对结果感到满意时添加。

相关内容