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