Extraindo uma string específica após uma determinada string do arquivo HTML usando um script bash

4

Eu tenho um arquivo HTML momcpy.html do qual eu quero extrair uma string específica após uma determinada string. O conteúdo do arquivo é como:

<tr><br>
<th height="12" bgcolor="#808080"><label for="<br>
 LSCRM:Abhijeet<br>
 <br>
 MCRM:Bhargav<br>
 <br>
 TLGAPI:GAURAVAURAV<br>
 <br>
 MOM:MANIKA"></td><br>

Isso está presente em uma das linhas de HTML.

Eu quero extrair Manika e armazená-lo em uma variável. Então basicamente eu quero extrair qualquer string que esteja presente depois de MOM: , pode ser dinâmico.

Eu tentei:

file='/home/websphe/tomcat/webapps/MOM/web/momcpy.html'
  y=$( awk '=="MOM:"{print }' $file)
 echo "$y"

Mas isso não funcionou.

    
por Abhijeet Anand 03.09.2017 / 21:00

3 respostas

3

Eu não posso aconselhar isso, porque analisar html com regex provavelmente não terminará , mas você pode conseguir obter a string MANIKA com

sed -nr '/MOM:/ s/.*MOM:([^"]+).*//p' file

Funciona bem na sua amostra mesmo assim ...

Notas

  • -n não imprime nada até pedirmos
  • -r use ERE
  • /string/ encontrar linhas com string
  • s/old/new/ replace old com new
  • .* qualquer número de caracteres
  • ([^"]+) salva alguns caracteres que não são "
  • backreference para caracteres salvos
  • p imprime apenas as linhas que mudamos
por Zanna 03.09.2017 / 21:41
1
grep -Po 'MOM:\K[^"]+' file.html

Atenção: esta não é uma solução muito robusta; E o seu HTML não é válido

    
por JJoao 05.09.2017 / 18:12
1

A string que você está procurando sempre tem MOM: antes, mas você não disse se sempre tem " depois dela. Para o propósito desta resposta, assumirei que você está procurando por cadeias que podem conter caracteres alfabéticos, numerais ou sublinhados em letras maiúsculas ou minúsculas. Estes são conhecidos como caracteres da palavra na terminologia de expressões regulares . Combinar essas "palavras" de texto é útil o suficiente para que a maioria dos dialetos de expressões regulares tenha recursos para ajudar a fazer isso. Se não é isso que você quer, você pode modificar essa solução de acordo ou usar as técnicas nas outras respostas.

Eu echo David Foerster's , Zanna's , e JJoao avisos sábios sobre a análise de HTML com regex e sobre isso não ser robusto. Por favor, tenha cuidado, e considere se o que você pediu é realmente exatamente o que você quer fazer. Em seu código de exemplo, você atribuiu o caminho para o arquivo de entrada à variável $file , portanto, assumirei que isso foi feito. Você atribuiu a saída do seu comando para $y , então eu farei o mesmo.

com grep

Isto é similar ao método de JJoao , e você pode usar esse método com a substituição de comandos, bem como se a expressão regular fosse é mais adequado às suas necessidades.

y="$(grep -oPm1 'MOM:\K\w+' "$file")"

-oPm1 é apenas uma maneira mais compacta de escrever -o -P -m 1 .

  • -o imprime apenas as correspondências, não a linha inteira.
  • -P usa PCRE , que suporta \K para descartar o texto correspondido até o momento, para que não seja incluído no texto correspondente retornado.
  • -m 1 pára depois de corresponder ao padrão uma vez. Desta forma, você atribui apenas a primeira correspondência à variável, em vez de várias correspondências separadas por novas linhas .

Note que você também pode adicionar -m1 ao comando em resposta de JJoao para que ele use apenas as correspondências do primeiro linha que tem algum.

Se a primeira linha com uma correspondência contiver várias correspondências , esse método grep fornecerá todas elas . Por exemplo, se essa linha for MOM:MANIKA MOM:JANE"></td><br> , então $y manterá o valor:

MANIKA
JANE

com sed

Isso se assemelha ao método de Zanna .

y="$(sed -rn '0,/.*MOM:(\w+).*/ s///p' "$file")"

Além de ser incluída como uma substituição de comando, as diferenças são que eu:

  • pare após a primeira linha que contém uma correspondência
  • corresponde a um ou mais caracteres de palavra ( \w+ ) em vez de caracteres até " ( [^"]+ )
  • consuma zero ou mais caracteres arbitrários ( .* ) primeiro, para que MOM: não precise aparecer no início da linha
  • use uma sintaxe mais compacta que evite escrever o padrão duas vezes.
A técnica que usei para isso requer GNU sed , mas esse é o sed implementação fornecida no Ubuntu.

Se a primeira linha com uma correspondência contiver várias correspondências , esse método sed fornecerá apenas a última . De MOM:MANIKA MOM:JANE"></td><br> você recebe:

JANE
    
por Eliah Kagan 20.09.2017 / 01:25