我希望以 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
任何帮助或建议都会受到赞赏,以获得所需的输出...
答案 0 :(得分:0)
使用perl:
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