Extração de texto do arquivo e saída da linha em um arquivo

5

Depois de usar o grep em um arquivo html, recebo a seguinte saída:

      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

Eu preciso extrair as seqüências de números das linhas acima e combiná-las em um URL como:

http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

Posso saber como posso fazer isso usando um script de shell?

    
por kilion 30.09.2016 / 19:04

4 respostas

6

Normalmente, eu aconselho que você use um analisador HTML adequado para analisar HTML.

No entanto, esses dados parecem bem diretos: usando uma aspa dupla (opcionalmente seguida de "v") como o separador de campo, pegue o segundo campo de cada linha. Então junte as peças com vírgulas

result=$( grep ... file.html | awk -F'"v?' '{print $2}' | paste -sd, )
echo "http://x.y.z/$result.mp3"
    
por glenn jackman 30.09.2016 / 19:15
5

Supondo que você tenha os dados de entrada da sua pergunta armazenados em um arquivo chamado data.txt , você pode usar este comando para gerar a URL:

grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/.mp3/'

Aqui está um exemplo de execução:

$ grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/.mp3/'
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

O que faz:

  • grep -Po '\d+-\d+' data.txt extrai todas as sequências NUMBER-NUMBER dos seus dados, como 3060000-3062005 e gera uma sequência por linha.
  • tr '\n' ',' converte todos os caracteres de nova linha de sua entrada em vírgulas, efetivamente unindo as linhas.
  • sed -r 's/(.*),$/http:\/\/x.y.z\/.mp3/' remove a vírgula final de sua entrada e a incorpora na string http://x.y.z/.mp3 , substituindo . Observe que todas as barras na sequência devem ser escapadas com uma barra invertida.
por Byte Commander 30.09.2016 / 19:15
4

com awk :

... | awk -F'"' '{part=part substr($2,2) ","} \
                  END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}'
  • -F'"' define o separador de campo como "

  • part=part substr($2,2) ","} obtém o segundo campo e substr($2,2) retira ov inicial da sequência, e o resultado é salvo com a adição de , como variável part

  • O END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"} chunk é executado após a análise de todos os registros, aqui estamos retirando o último , da variável part e imprimindo a saída formatada desejada

Exemplo:

% cat file.txt
      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

% awk -F'"' '{part=part substr($2,2) ","} END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}' file.txt
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
    
por heemayl 30.09.2016 / 19:19
0

Primeiro, você precisará descobrir como obter o texto necessário para a saída. Como outras respostas mostram como fazer isso, não precisarei incluir essas informações na minha resposta.

No entanto, vou abordar como gerar essas informações em um arquivo.

Para fazer isso, insira > filename após o seu comando. Isso sobrescreverá o conteúdo do arquivo (criando-o se ele não existir) com a saída padrão (stdout) do comando usado.

Um método alternativo é usar >> em vez de > para anexar o texto a um arquivo, em vez de sobrescrevê-lo.

    
por Dev 30.09.2016 / 23:46