Qualquer resposta dependerá do que você realmente pode saber sobre sua entrada.
Se você sabe que quer o segundo bar3
rodeado por <font>
, pode fazer:
perl -pe 's#(.*bar3.*)(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
ou
sed 's#\(.*bar3.*\)\(bar3\)#<font style=BACKGROUND-COLOR:red></font>#' file
ou, com GNU sed
:
sed -r 's#(.*bar3.*)(bar3)#<font style=BACKGROUND-COLOR:red></font>#' file
Se você quiser alterar todas as ocorrências de bar3
que estão entre >
e <
(sem <
entre), você pode fazer:
perl -pe 's#(>[^<]*)(bar3)([^<]*<)#$1<font style=BACKGROUND-COLOR:red>$2</font>$3#' file
ou
sed 's#\(>[^<]*\)\(bar3\)\([^<]*<\)#<font style=BACKGROUND-COLOR:red></font>#' file
ou, com o GNU sed
sed -r 's#(>[^<]*)(bar3)([^<]*<)#<font style=BACKGROUND-COLOR:red></font>#' file
Se você quiser substituir qualquer bar3
que comece na 33ª posição de uma linha, faça:
perl -pe 's#(.{32})(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
ou
sed 's#\(.\{32\}\)\(bar3\)#<font style=BACKGROUND-COLOR:red></font>#' file
ou, com o GNU sed
sed -r 's#(.{32})(bar3)#<font style=BACKGROUND-COLOR:red></font>#' file
Existem outras opções, é claro, mas elas sempre dependerão exatamente do que você pode ter certeza sobre seus dados de entrada.