grep palavras ao redor de um token

1

Eu tenho algumas linhas em um arquivo como:

This is one word1:word2 of the lines    
This is another word3:word4 of the lines    
Line without a match    
Yet another line word5:word6 for test

Eu preciso fazer um grep para : e retornar as palavras antes e depois de : .

A saída que preciso do greping acima das linhas é

word1:word2
word3:word4
word5:word6
    
por Mr. B 25.11.2014 / 10:43

5 respostas

1

Com o GNU grep :

start cmd:> echo "This is one word1:word2 of the lines" |
  grep -Eo '[[:alnum:]]+:[[:alnum:]]+'
word1:word2

start cmd:> echo "This is one wordx:wordy of the lines" |
  grep -Eo '[[:alpha:]]*:[[:alpha:]]*'
wordx:wordy

start cmd:> echo "This is one wo_rdx:wo_rdy of the lines" |
  grep -Eo '[[:alpha:]_]*:[[:alpha:]_]*'
wo_rdx:wo_rdy
    
por 25.11.2014 / 10:46
1

POSIXly (embora tenha cuidado, algumas implementações tr (como as do GNU) não funcionam corretamente com caracteres de múltiplos bytes).

tr -s '[:space:]_' '[\n*]' << 'EOF' |
  grep -xE '[[:alnum:]_]+:[[:alnum:]_]+'
This is one word1:word2 of the lines and another is word:word   
This is another word3:word4 of the lines  and this is not wordnot::wordnot
Line without a match    
Yet another line word5:word6 for test
This is one wo_rdx:wo_rdy of the lines
This is one wordx:wordy of the lines
not/a:match
EOF

Dá:

word1:word2
word:word
word3:word4
word5:word6
rdx:wo
wordx:wordy
    
por 25.11.2014 / 12:25
1

Para todos os casos do resultado desejado, você pode usar o GNU grep com suporte a PCRE ( -P ) e sua palavra regex ( \w ) da seguinte forma:

grep -oP '\w+:\w+' file

Arquivo de entrada:

This is one word1:word2 of the lines and another is word:word   
This is another word3:word4 of the lines  and this is not wordnot::wordnot
Line without a match    
Yet another line word5:word6 for test
This is one wo_rdx:wo_rdy of the lines
This is one wordx:wordy of the lines

Saída:

word1:word2
word:word
word3:word4
word5:word6
wo_rdx:wo_rdy
wordx:wordy

Como você pode ver, grep não corresponde a wordnot::wordnot pattern, porque tem um : extra entre si.

    
por 25.11.2014 / 11:35
0

Se você usasse sed para fazer isso, poderia ser feito como:

sed -n 's/\( *: *\)*\([^ ]*:[^ ]* *\)*.\{,1\}//g;/./p' <<\IN 
This is one word1:word2 of the lines
This is another word3:word4 of the lines
Line without :a :match
Yet another line word5:word6 for test:123:test
IN

OUTPUT

word1:word2 
word3:word4 
word5:word6 test:123:test
    
por 25.11.2014 / 11:57
0

Através do grep,

grep -oP '[^:\s]+:[^:\s]+' file

OR

grep -oP '\S+?:\S+' file

O comando acima não só busca as strings como foo:bar mas também ?foo:bar?

    
por 25.11.2014 / 13:15

Tags