Como substituir a última ocorrência do padrão em uma terceira última linha de um arquivo

0

Eu tenho um arquivo no qual eu quero substituir a última ocorrência de string em terceiro para a última linha em um arquivo. Eu tenho um arquivo como:

  analyze_compression_testpoints -log no -TESTMODE FULLSCAN
  -EXPERIMENT <br /> azul_rrfa -outputfile
  ./testresults/testinsertion.file<br />
</body>
</html>

Eu quero substituir <br /> por </font> apenas na terceira última linha. Eu estou usando:

sed -i "s|\(.*\)<br />\$|</font>|g"

mas está substituindo toda a última ocorrência em cada linha, mas eu quero apenas a última ocorrência de arquivo, não cada linha.

    
por Rash 05.09.2017 / 18:42

2 respostas

8

com sed :

tac file | sed '3 s|<br />$|</font>|' | tac

com ed :

echo -e '$-2s/<br \/>$/<\/font>/\nw' | ed -s file

com vim :

:$-2 s!<br />$!</font>!
    
por 05.09.2017 / 18:55
0

Como esta é a última ocorrência no arquivo, você pode usar este script sed :

sed -i 'H;1h;$!d;g;s_\(.*\)<br />_</font>_' yourfile.html

ou simplificado com o GNU sed e a expressão regular estendida:

sed -izE 's_(.*)<br />_</font>_' yourfile.html

O truque é processar o arquivo inteiro em um buffer. A versão POSIX faz isso coletando no buffer de armazenamento, a versão GNU usa a opção -z para isso. Então, com o comando s substituir tudo ( .* ) incluindo a última ocorrência do padrão por tudo antes do padrão (o refere-se à parte em () ) e a substituição.

Outra tentativa, se você realmente precisar substituir apenas a terceira a última linha (não haverá substituição se não houver correspondência, não houver substituição na penúltima ou na última linha):

sed '1N;N;$!{P;D];s_<br />_</font>_' yourfile.html
    
por 06.09.2017 / 09:51