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