我正在尝试搜索特定项目,并且仅替换从到[7_addons]
出现的下一个条目。enabled=0
enabled=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
从外向内开始,这ed
在input
文件上以脚本模式执行,并将 ANSI 带引号的字符串作为此处字符串传递给它,然后将输出重定向到 /dev/null。 /dev/null 重定向只是丢弃 ed 在执行工作时发现的行的报告。
这里的字符串分解为以下用\n
- 分隔的命令:
/^\[7_addons\]$
-- 向前搜索恰好位于该行[7_addons]
的开头 (^
) 和结尾 ($
) 的行/^enabled=0$
--然后向前搜索恰好是的行enabled=0
c
-- 更改该行enabled=1
——对于本文.
-- 替换文本结束w
-- 将文件写入磁盘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
您可能想让正则表达式更严格一些;根据您问题中的数据,我无法做到这一点。