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>!
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.
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>!
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
Tags text-processing sed