将文本添加到文件中最后一个模式匹配之前的 2 行

将文本添加到文件中最后一个模式匹配之前的 2 行

TEXT我需要在myfile.txt最后找到文本的位置添加多行字符串# My Search

如果它是常规模式替换,那么sedwithi就可以了。但是我不知道如何在 . 中的比赛上方走两行sed

例子,myfile.txt

text1
text2
#
# My Search
#
text4
text5
#
# My Search
#
text6

TEXT好像:

TEXT="
[my search]
home=/var/home
string=random

"

myfile.txt应该看最后:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

答案1

用于grep -n提取行号,然后在 sed 地址中使用它来插入文本,需要正确引用该文本,即每个换行符之前必须有一个反斜杠:

line=$(grep -n '# My Search' myfile.txt | tail -n1 | cut -f1 -d:)
((--line))
text=${TEXT//$'\n'/$'\\\n'}
text=${text%$'\\\n'}$'\n'

sed "$line i \\
$text" myfile.txt

答案2

tac+bash(变量替换)+ GNUsed方法:

txt_reversed=$(echo "$TEXT" | tac)
tac myfile.txt \
| sed -e "N;N;N; s~#\n# My Search\n#~&${txt_reversed//$'\n'/\\n}\n~" | tac

输出:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

答案3

一次性完成此操作的最简单方法是使用一种可以向后搜索的工具,ed这就是其中之一。理想情况下,您会将文本保存在文件中(例如insert.txt),并在最后一次出现 之前插入文件内容两行,PATTERN以便您可以运行:

ed -s infile <<\IN
.t.
?PATTERN?-2r insert.txt
$d
,p
q
IN

它找到最后一次出现的PATTERN, 上升到另一2行并r插入insert.txt。然后它通过 打印缓冲区的内容,pw如果您想就地编辑文件,请将其替换为。


对于无法向后搜索的其他工具,两遍是可行的方法:第一遍 - 获取行号,第二遍 - 在 line 之后NR-2或 line 之前插入文本内容NR-1。对于保存在变量中的文本,我更喜欢依赖awk正则表达式的其他工具(后者需要预处理要插入的文本,以便转义任何特殊字符:有几个需要转义的字符,而不仅仅是换行符,具体取决于使用的技术):

export TEXT
awk 'NR==FNR{if ($0 ~ /PATTERN/){c=NR};next}
{if (FNR==(c-1)){print ENVIRON["TEXT"]}};1' infile infile

答案4

我在 stackExchange 中的第一个贡献。

这是如何在最后一个匹配之前插入一行sed

sed -e '/PATTERN[^\n]*/,$!b;//{x;//p;g};//!H;$!d;x;iTEXTOINSERT' FILE

sed这是如何在第一个匹配之前插入一行。

sed -i -e '/PATERN/{a\\TEXTOINSERT' -e ':a;n;ba}' FILE

问候!

相关内容