在最后一次模式匹配发生后,将多行变量附加到新行

时间:2015-01-14 03:19:20

标签: arrays bash variables awk sed

我希望以 sed 来实现这一目标,但可以使用任何其他 bash 编程语言:

我有一个变量$bonding,其中包含以下行/字符串:

add bonding group 0 
add bonding group 1 
add bonding group 2 

我还有一个文本文件,其中包含随机数量的相同字符串/行文字:

Some identical text
Some identical text
Some identical text
Some different text

我想将变量$bonding附加到文件中最后一个模式匹配结尾的新行:

Desired Output:

Some identical text
Some identical text
Some identical text
add bonding group 0 
add bonding group 1 
add bonding group 2 
Some different text

请记住,文本文件中相同字符串/行的数量可以是随机的。

我尝试创建array variable并使用sed来获得所需的输出:

declare -a bonding
IFS=$'\n'
bonding=`grep -E 'bonding' bonding.txt`

sed "/some identical text/a\\"${bonding[@]}"" file

但这会占用数组中的第一个字符串,并在每个some identical text字符串后追加到新行:

Wrong Output:

Some identical text
add bonding group 0 
Some identical text
add bonding group 0 
Some identical text
add bonding group 0 

任何帮助或建议都会受到赞赏,以获得所需的输出...

2 个答案:

答案 0 :(得分:0)

使用

var="$var" perl -0pe 's/.*\nSome identical text/$&\n$ENV{"var"}/s' file

(正如您所料,$var是要追加预期行的整个变量)

答案 1 :(得分:0)

只需解析文件两次,第一次(NR == FNR)识别包含目标字符串的最后一行的行号,第二次打印所有行然后另外打印“绑定”行当前行号与您在第一行时识别的行号相同:

$ awk -v tgt="Some identical text" -v bonding="$bonding" '
    NR==FNR { if ($0==tgt) nr=NR; next }
    { print }
    FNR==nr { print bonding }
' file file
Some identical text
Some identical text
Some identical text
add bonding group 0
add bonding group 1
add bonding group 2
Some different text

或者使用GNU awk for multi-char RS如果你的目标字符串不包含RE元字符,你可以一次读取整个文件,然后只需要用相同的块替换重复的目标行块然后你的粘合字符串:

$ gawk -v RS='^$' -v ORS= -v tgt="Some identical text" -v bonding="$bonding" '
    { sub("("tgt"\n)+","&"bonding"\n") } 1
' file
Some identical text
Some identical text
Some identical text
add bonding group 0
add bonding group 1
add bonding group 2
Some different text