如何仅在匹配后替换单个相似行

如何仅在匹配后替换单个相似行

我正在尝试搜索特定项目,并且仅替换从到[7_addons]出现的下一个条目。enabled=0enabled=1

在这个例子中:

sed -i -e 's#enabled=0#enabled=1#g' /etc/file.txt

..替换enabled=0中显示的所有内容file.txt,但我只希望它替换搜索字符串之后的内容7_addons,替换=0=1,然后停止。

答案1

如果您想替换文件中enabled第一行后面假定存在的行,您可以使用 ed![7_addons]

ed -s input <<< $'/^\[7_addons\]$\n/^enabled=0\nc\nenabled=1\n.\nw\nq' > /dev/null

从外向内开始,这edinput文件上以脚本模式执行,并将 ANSI 带引号的字符串作为此处字符串传递给它,然后将输出重定向到 /dev/null。 /dev/null 重定向只是丢弃 ed 在执行工作时发现的行的报告。

这里的字符串分解为以下用\n- 分隔的命令:

  1. /^\[7_addons\]$-- 向前搜索恰好位于该行[7_addons]的开头 ( ^) 和结尾 ( $) 的行
  2. /^enabled=0$--然后向前搜索恰好是的行enabled=0
  3. c-- 更改该行
  4. enabled=1——对于本文
  5. .-- 替换文本结束
  6. w-- 将文件写入磁盘
  7. q——退出编辑

在此示例输入上:

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=0
other=bat
[8_addons]
foo=quux

生成的文件是:

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=1
other=bat
[8_addons]
foo=quux

答案2

sed '/\[7_addons\]/{n;s/enabled=0/enabled=1/}'

[7_addons]或者如果和之间还有其他行enabled=0

sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/'

例子:

$ cat foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=0
enabled=0
$ sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/' foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=1
enabled=0

您可能想让正则表达式更严格一些;根据您问题中的数据,我无法做到这一点。

相关内容