如何替换文件倒数第三行中最后一次出现的模式

如何替换文件倒数第三行中最后一次出现的模式

我有一个文件,我想在其中替换文件中第三行到最后一行中最后一次出现的字符串。我有一个像这样的文件:

  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

相关内容