使用 sed 替换除注释之外的第一次出现

Replacing first occurence except comments using sed

我有一个格式的文本文件:

a = 1
#b = [2,3]
c = 4
d = [5,6]
e = [7,8]

我想用数字替换括号(和括号)内的模式,但忽略注释中的匹配项,最好使用 sed。

对于只有一行匹配的文件,我使用了

sed -i "/^#/!s/\[.*\]/9/" myfile

如果有更多匹配项,如何修改为仅替换第一个匹配项?

这条单线应该可以完成这项工作:

sed  '/^\s*#/!{s/\[[^]]*\]/9/}' file

如果您想就地进行更改,请添加 -i 选项。

这是正确的,因为只改变了第一次出现的地方。

awk '!end && /^[^#]+ = \[/ {="9"; end=1}1' myfile

  • 如果没有结束标志并且行不是从 # 开始并与 = [ 匹配,则更改第三列并设置标志以防止在下一次出现时更改。

a = 1

#b = [2,3]

c = 4

d = 9

e = [7,8] <--- 这个没有改成你想要的