Awk 在匹配模式-unix之间添加一行

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:与显示的示例不

我想在“模块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:与显示的示例不匹配`{'

,请尝试以下内容

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