我有一个文件,我想在其中替换文件中第三行到最后一行中最后一次出现的字符串。我有一个像这样的文件:
analyze_compression_testpoints -log no -TESTMODE FULLSCAN
-EXPERIMENT <br /> azul_rrfa -outputfile
./testresults/testinsertion.file<br />
</body>
</html>
我只想在倒数第三行替换<br />
为。</font>
我在用:
sed -i "s|\(.*\)<br />\$|\1</font>|g"
但它正在替换每行中的所有最后一次出现,但我只想要文件的最后一次出现,而不是每一行。
答案1
和sed
:
tac file | sed '3 s|<br />$|</font>|' | tac
和ed
:
echo -e '$-2s/<br \/>$/<\/font>/\nw' | ed -s file
和vim
:
:$-2 s!<br />$!</font>!
答案2
由于这是文件中的最后一次出现,因此您可以使用以下sed
脚本:
sed -i 'H;1h;$!d;g;s_\(.*\)<br />_\1</font>_' yourfile.html
或使用 GNUsed
和扩展正则表达式进行简化:
sed -izE 's_(.*)<br />_\1</font>_' yourfile.html
诀窍是在一个缓冲区中处理整个文件。 POSIX 版本通过在保持缓冲区中收集来实现此目的,GNU 版本使用-z
此选项。然后,使用s
命令将所有内容 ( .*
) 包括最后一次出现的模式替换为该模式之前的所有内容(\1
指的是 中的部分()
)并进行替换。
其他尝试,如果您确实需要仅替换倒数第三行(如果没有匹配则不替换,倒数第二行或最后一行不替换):
sed '1N;N;$!{P;D];s_<br />_</font>_' yourfile.html