匹配一个模式并替换它后面的第一个字符串实例

use*_*831 4 grep sed awk perl regular-expression

我正在编写一个配置文件的修改脚本,如下所示:

[purple]
auth = no
enabled = 0
username = 
password =
priority = 0
host = True

[shovel]
group = 
manual = False
enabled = 0
username = 
Run Code Online (Sandbox Code Playgroud)

有许多 [类别] 并且有时具有键/值对的相同键的地方。

是否可以使用 awk/sed/grep/tr/cut/perl 制作一个单线,它可以将“enabled = 0”的值更改为“enabled = 1”,但仅适用于类别 [shovel]?

Zan*_*nna 6

sed您可以使用范围(停止在[shovel]类别末尾的空行):

sed '/\[shovel\]/,/^$/ s/enabled = 0/enabled = 1/' file
Run Code Online (Sandbox Code Playgroud)

第一部分/\[shovel\]/,/^$/意味着找到一行[shovel],继续直到找到一个空行,然后s/old/new只在该部分执行以下命令(在这种情况下是一个简单的)file

请注意回复评论:sed不会接受范围和地址中的替代分隔符(因此/,如果您需要匹配它们,则转义任何必须是文字的字符),除非它们前面有反斜杠。您始终可以在以下任何命令中使用备用分隔符,例如:

sed '/\[shovel\]/,/^$/ s|enabled = 0|enabled = 1|' file
Run Code Online (Sandbox Code Playgroud)

或者

sed '\|\[shovel\]|, |^$| s|enabled = 0|enabled = 1|' file
Run Code Online (Sandbox Code Playgroud)