输入文件包含:
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=765
para3=1345
[xyz]
para1=888
para2=236
para3=964
shell脚本的要求是替换特定块的一个参数
例如:将para2=765
替换为para2=999
块的[pqr]
请帮助我如何使用sed
或awk
命令实现此目的。
答案 0 :(得分:1)
我将如何做到这一点:
awk '/^\[pqr\]/ {sub(/^para2=.*/,"para2=999")}1' RS= ORS="\n\n" file
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=999
para3=1345
[xyz]
para1=888
para2=236
para3=964
通过将RS
设置为空,您可以使awk
在空白行分隔的块模式下工作。
然后通过搜索以[pqr]
开始的块来确保我们处于正确的块中
在此块中,将数据从para2=765
更改为para2=999
,然后将其打印出来。
另一种方法:
awk '/^\[pqr\]/ {f=1} f && sub(/^para2=.*/,"para2=999"){f=0}1' file
如果找到pqr
则设置标志,如果标志为真则更改数据,重置标志。
答案 1 :(得分:1)
通过另一种方式,
$ sed -r ':l /^\[pqr\]/{:loop ;n;/^$/{b l};s/(para2=).*/\1999/g;b loop;}' file_name
b loop - Using the looping concept getting the line one by one.
^\[pqr\] - If the corresponding pattern is found.
^$ - Represent new line only.
s/ - Replacement to particular pattern.
n - For getting next line
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed '/\[pqr\]/,/^\s*$/s/\(para2=\)[0-9]*/\1999/' file
将从para2=
开始的块中的[pqr]
后的数字替换为空行。
答案 3 :(得分:1)
惯用的awk解决方案是:
$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} $1=="[pqr]"{$3="para2=999"} 1' file
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=999
para3=1345
[xyz]
para1=888
para2=236
para3=964