TEXT
我需要在myfile.txt
最后找到文本的位置添加多行字符串# My Search
。
如果它是常规模式替换,那么sed
withi
就可以了。但是我不知道如何在 . 中的比赛上方走两行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
。然后它通过 打印缓冲区的内容,p
。w
如果您想就地编辑文件,请将其替换为。
对于无法向后搜索的其他工具,两遍是可行的方法:第一遍 - 获取行号,第二遍 - 在 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
问候!