sed或awk替换块中的一行

时间:2014-06-30 07:18:57

标签: bash shell awk sed

输入文件包含:

[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] 请帮助我如何使用sedawk命令实现此目的。

4 个答案:

答案 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