Awk 在匹配模式-unix之间添加一行
我想在“模块xyz”中的madguy xyz-行下面插入“123”。 有多个模块具有相似的线路。但我只想在“模块xyz”中添加它 这是我试过但不起作用的代码Awk 在匹配模式-unix之间添加一行,awk,sed,Awk,Sed,我想在“模块xyz”中的madguy xyz-行下面插入“123”。 有多个模块具有相似的线路。但我只想在“模块xyz”中添加它 这是我试过但不起作用的代码 sed -i "/module xyz/,/^endmodule/{/madguy-xyz-/a 123}" <file_name> sed-i”/module xyz/,/^endmodule/{/madguy xyz-/a 123}” 这是我得到的错误: sed:-e表达式#1,字符0:与显示的示例不
sed -i "/module xyz/,/^endmodule/{/madguy-xyz-/a 123}" <file_name>
sed-i”/module xyz/,/^endmodule/{/madguy xyz-/a 123}”
这是我得到的错误:
sed:-e表达式#1,字符0:与显示的示例不匹配`{',请尝试以下内容
awk '1; /^endmodule$/{found=""};/^module xyz$/{found=1} found && /^ +madguy-xyz-/{print "123"} ' Input_file
一旦您对上述命令的结果满意,要将输出保存到输入文件中,请尝试以下操作:
awk '1;/^endmodule$/{found=""} /^module xyz$/{found=1} found && /^ +madguy-xyz-/{print "123"} ' Input_file > temp && mv temp Input_file
说明:添加上述内容的详细说明
awk ' ##Starting awk program from here.
1;
/^endmodule$/{found=""} ##Printing current line here.
/^module xyz$/{ ##Checking condition if line contains module xyz then do following.
found=1 ##Setting found to 1 here.
}
found && /^ +madguy-xyz-/{ ##Checking if found is SET and line contains madguy-xyz- then do following.
print "123" ##Printing 123 here.
}
' Input_file ##Mentioning Input_file name here.
注意:如果您的线路正好有
模块xyz
值,则将/module xyz/
(此条件)上方的值更改为$0==“module xyz”
。使用GNU,我建议:
sed -i -e "/module xyz/,/^endmodule/{/madguy-xyz-/a 123" -e "}" file
这可能适用于您(GNU-sed):
对于包含模块xyz-
的行,继续打印行,直到包含模块xyz-
的行
也打印此行,然后将其替换为123
另一种替代解决方案:
sed '/module/h;G;/madguy-xyz.*\nmodule xyz/{P;s/\S.*/123/};P;d' file
将任何模块线存储在保持空间中
将模块行附加到每一行
如果第一行包含madguy xyz-
,第二行包含模块xyz
,请打印第一行,然后用第二行替换123
打印第一行并删除整行。在每个Unix机箱的任何shell中使用任何POSIX awk,以下内容适用于您问题中的晴天案例和所有雨天案例,如我在中提到的以及更多的案例:
$ cat tst.awk
{ print }
$1 == "endmodule" {
inMod = 0
}
inMod && (index($1,old) == 1) {
sub(/[^[:space:]].*/,"")
print $0 new
}
($1 == "module") && ($2 == mod) {
inMod = 1
}
在
}之前插入换行符
。如果模块xyzabc
存在或模块xyz
不包含mdguy zyz-
,但后续模块包含或包含foo-madguy xyz
或包含类似
的regexp元字符或问题示例中未涵盖的各种其他情况,则您的多个答案将失败。匹配你想要的文本总是微不足道的,但不匹配你不想要匹配的相似文本要困难得多。因此,在发布问题时,值得花些精力创建一个示例,包括尽可能多的雨天案例,而不仅仅是1个晴天案例。
sed '/module/h;G;/madguy-xyz.*\nmodule xyz/{P;s/\S.*/123/};P;d' file
$ cat tst.awk
{ print }
$1 == "endmodule" {
inMod = 0
}
inMod && (index($1,old) == 1) {
sub(/[^[:space:]].*/,"")
print $0 new
}
($1 == "module") && ($2 == mod) {
inMod = 1
}
$ awk -v mod='xyz' -v old='madguy-xyz-' -v new='123' -f tst.awk file
module abc
njkenjkfvsfd
madguy-xyz-mafdvnskjfvn
enfvjkesn
endmodule
module xyz
njkenjkfvsfd
madguy-xyz-mafdvnskjfvn
123
enfvjkesn
endmodule