Extrai uma string única de cada linha contendo string

0

Aqui está um exemplo de bloco de texto de um arquivo:

Now is the time for all blah:1; to come to the aid
Now is the time for all blah:1; to come to the aid
Now is the time for all blah:1; to come to the aid
Now is the time for all blah:10; to come to the aid
Go to your happy place  blah:100; to come to the aid
Go to your happy place  blah:4321; to come to the aid
Go to your happy place  blah:4321; to come to the aid
Now is the time for all blah:4321; to come to the aid
Now is the time for all blah:9876; to come to the aid
Now is the time for all blah:108636; to come to the aid
Now is the time for all blah:1194996; to come to the aid

Pergunta: Como eu extrairia todos os números exclusivos das linhas que têm "é o" neles?

Eu tentei usar grep -o -P -u '(?<=blah:).*(?=;) ', mas ele não gosta do ponto e vírgula

    
por blake 26.09.2017 / 19:41

4 respostas

5

Você está procurando a diretiva \K para esquecer as coisas que acabou de combinar.

grep -oP 'is the.*?blah:\K\d+'

Então sort -u

    
por 26.09.2017 / 21:12
3

Usando sed :

$ sed -n '/is the/s/^.*blah:\([0-9]*\);.*$//p' file | sort -u
1
10
108636
1194996
4321
9876

A substituição substitui o conteúdo de todas as linhas que contêm a string is the pelo número entre blah: e ; . As linhas que não contêm a string são ignoradas.

    
por 26.09.2017 / 19:55
0
cat file | grep "is the" | awk -F':' '{print $2}'|awk -F';' '{print $1}'|sort -u
    
por 26.09.2017 / 20:01
0

Tente isto :

grep "is the" file | sed 's/.*blah://;s/;.*//' | sort -u

Explicação :

  1. grep obtém todas as linhas com " is the " (em qualquer parte da linha)
  2. sed remove todos antes de " : " e depois de " ; " (você pode usar sed -e 's/.*blah://' -e 's/;.*//' para entender melhor)
  3. sort classifica as linhas
por 26.09.2017 / 19:56