我想替换'DUMP ='行或如果某个块中不存在则添加新行。当从[text]
到下一个[text]
定义块时,例如:
[name]
sometext=...
moretext=...
DUMP=
moretext2=...
[name2]
...
要替换现有行,我将这样做:
sed -i '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example' $file
我不知道在一两个内衬中是否可行,但是如果该区块中不存在DUMP=...
,该如何添加选项呢?
示例1:
file1.txt
:
[name]
A=text1
B=text2
DUMP=x
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
sed '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example' file1.txt
输出:
[name]
A=text1
B=text2
DUMP=example
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
示例2:
file1.txt
:
[name]
A=text1
B=text2
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
sed '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example
<add DUMP incase it doesn't exist>' file1.txt
输出:
[name]
A=text1
B=text2
C=text3
DUMP=example
[name2]
A=text12
B=text22
DUMP=x2
C=text32
答案 0 :(得分:1)
awk '/^\[/&&/]$/&&s&&!f{print " DUMP=example"; s=0}
$0 ~ "^\["blockname"]$"{s=1;f=0}
s&&/^ *DUMP=/{$0=" DUMP=example"; f=1}
1
END{if(s&&!f) print " DUMP=example"; } blockname="name" <file>
在这里,我们执行了以下操作:
s
检查是否找到了正确的块f
检查是否在正确的块中找到了条目DUMP=
/^\[/&&/]$/&&s&&!f{print " DUMP=example"; s=0}
:: :如果我们输入一个新块,而前一个块是正确的(s==1
),而该块没有{{1} }条目(DUMP=
),写一个。f==0
:: 如果我们位于正确的块(s&&/^ *DUMP=/{$0=" DUMP=example"; f=1}
)中,并且找到了s==1
条目,请对其进行更新。