Como procurar se existem mais de uma linha depois de uma certa string?

0

Eu tenho um script que gera a seguinte saída:

URL:
 http://framework.com

Name(s):
 Patching Framework
----------------------------------------------------------

URL:
 http://asjkdfhn.com

Name(s):
 jadsbfkjdfhn dsjfkh
----------------------------------------------------------

URL:
 http://wusdh.com

Name(s):
 Wholesale Underwear dark health
----------------------------------------------------------
URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

Eu quero imprimir / ecoar somente os URLs / nomes que tenham mais de um nome listado.

Exemplo: acima dos URLs / nome (s), seguindo apenas para serem impressos:

URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

É possível usar o script bash / shell?

    
por Koshur 22.03.2016 / 18:04

2 respostas

1

Isso deve funcionar. Adicione seu nome de arquivo após este comando:

sed -n '
       /URL:/{
              :addanotherrow
              N
              /-\{50,\}/bmatchandprint
              baddanotherrow
              :matchandprint
              /Name(s):[^\n]*\n[^-\n]*\n[^-]/p
              }
       '

Algumas explicações:

  • the sed parameter "-n" prevents automatic printing of pattern space - the matched patterns are printed with the "p" at the end of the last row of the statements inside the brackets {}
  • labels are marked with a leading ":", so ":addanotherrow" and ":matchandprint" are jumping points for the "b" statements
  • b followed by a label is a command to branch to that label (something like a GOTO)
  • N appends the next line of input into the pattern space
  • lines starting with "/" just proof the pattern space against a regular expression, when the regex fits, the following command is executed, as already mentioned the b branches and the p prints the pattern space

Em outras palavras: a string "URL:" é pesquisada, a partir desse ponto, mais linhas são incluídas até que uma linha (pelo menos 50 hífens em uma linha) seja encontrada. Depois disso, as linhas reunidas ("espaço de padrão") são examinadas. Somente quando um "Nome (s):" com mais de uma linha (que não está começando com um hífen) for encontrado, o espaço padrão será impresso.

Espero que ajude: -)

    
por 22.03.2016 / 23:57
0
sed -n '
       /URL:/{
              :1                          #return point
              N                           #append next line
              /-{20,}/!b1                 #go to return point while reach ---
              /Name(s):\n[^\n]\+\n[^-]/p  #check if more 1 line after «Name(s)»  
              }
       '
    
por 22.03.2016 / 19:56