Como destacar determinada string em determinado local?

2

Como podemos modificar isso:

<a href="http://foo.bar1">asfdlksafbar1qsasadf</a><br>
<a href="http://foo.bar2">svasfbar2saldkfj</a><br>
<a href="http://foo.bar3">safdfrhbar3saljfd</a><br>
<a href="http://foo.bar4">erasfasfbar4asfer</a><br>

para isso?

<a href="http://foo.bar1">asfdlksafbar1qsasadf</a><br>
<a href="http://foo.bar2">svasfbar2saldkfj</a><br>
<a href="http://foo.bar3">safdfrh<font style=BACKGROUND-COLOR:red>bar3</font>saljfd</a><br>
<a href="http://foo.bar4">erasfasfbar4asfer</a><br>

Portanto, somente o bar3 será destacado, somente se ocorrer entre:

">xxx</a>


Estou usando o ksh / OpenBSD.

    
por Manuel Faux 09.02.2015 / 19:50

4 respostas

1

O seguinte deve funcionar em qualquer sistema com Perl:

perl -pe 's/(>.*)(bar3)(.*<\/a>)/$1<font style=BACKGROUND-COLOR:red>$2<\/font>$3/'

Pelo menos, faz a coisa certa no seu arquivo de exemplo; o regexp em s/regexp/replacement/ pede para corresponder bar3 entre > e </a> , como você pediu, mas se a sua entrada HTML real for mais complexa do que isso, pode ser muito simplista. Por favor, forneça mais detalhes sobre suas necessidades em caso afirmativo.

    
por 09.03.2015 / 17:00
0

Tente

awk -v pattern="bar3" 'match($0, pattern){
  beg = index( $0, ">")
  content = gensub(/<.*$/, "", "", gensub(/^[^>]+>/, "", "", $0))
  beg_str = index( content, pattern)
  if (match (content, pattern)) {
    print substr($0, 0, beg) substr(content, 0, beg_str - 1)  "<fontstyle=BACKGROUND-COLOR:red>" substr(content, beg_str, length(pattern)) "</font>" substr(content, beg_str + length(pattern)) "</a><br>"
    next
  }
}
{print}' file.html

Espero que funcione no ksh

    
por 05.03.2015 / 20:47
0

Esta solução requer a versão GNU do awk ...

awk '{ print gensub(/(>.*)(bar3)(.*<\/a>)/,"\1<font style=BACKGROUND-COLOR:red>\2</font>\3","g") }' yourfile.html
    
por 09.03.2015 / 12:13
0

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.

    
por 11.03.2015 / 14:06

Tags