Bash Sed或awk替换块中的线

Bash Sed或awk替换块中的线,bash,shell,awk,sed,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脚本的要求是替换特定块的一个参数 例如:用块的[pqr]para2=999替换para2=765 请帮助我如何使用sed或awk命令来实现这一点。以下是我的方法: awk '/^\[pqr\]/ {su

输入文件包含:

[abc]  
para1=123  
para2=456  
para3=111  

[pqr]  
para1=333  
para2=765  
para3=1345  

[xyz]  
para1=888  
para2=236  
para3=964  
shell脚本的要求是替换特定块的一个参数
例如:用块的
[pqr]
para2=999
替换
para2=765

请帮助我如何使用
sed
awk
命令来实现这一点。

以下是我的方法:

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
设置为nothing,您可以使
awk
在由空行分隔的块模式下工作。
然后通过搜索以
[pqr]

开头的块,确保我们处于正确的块中 在此块中,将数据从
para2=765
更改为
para2=999
,然后打印


另一种方法是:

awk '/^\[pqr\]/ {f=1} f && sub(/^para2=.*/,"para2=999"){f=0}1' file

如果找到
pqr
,则设置标志;如果标志为真,则更改数据;通过另一种方式重置标志。

$ 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
这可能适用于您(GNU-sed):


将起始块
[pqr]
中的
para2=
后面的数字替换为空行。

惯用的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

你自己都做了些什么?谢谢你的帮助。我在想,如果块之间没有线分隔符怎么办?在这种情况下如何替换?@user3789290在我的示例中使用最后一个
awk
。它不需要空格或其他分隔符。例如,您需要锚定您的REs,否则上面的将用
para2=99912345
替换
para2=76512345
。我怀疑OP只是想替换
para2=
行,不管它有什么值。另一种方法
会失败,因为para2行不是紧跟在[pqr]行之后,所以在sub()有机会之前设置f=0。您需要将其写为
awk'/^[pqr\]/{f=1}f&&sub(/^para2=.*/,“para2=999”){f=0}1'文件
,但在找到下一个
[…]
模式时,可能还需要注意重置
f
。或者您可以使用计数器跟踪
[…]
行后的行数,并替换第二行,而不是使用sub()。@EdMorton使用
sub
作为真正的测试,我会做
awk'/^[pqr\]/{f=1}f&/^para2/{sub(/^para2=.*,“para2=999”);f=0}1'
您的测试更好,更新了。
$ 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