Imprimindo grupos de correspondências com grep

2

Eu tenho o seguinte grep:

grep -Po 'href="(http://.*)">Transcript.* - ([0-9]*)\. (.*)</a>'

Eu gostaria de imprimir os grupos de jogos. Existe uma maneira de fazer isso sem Perl / Python? Eu tentei usar sed , mas não consegui fazer isso funcionar - provavelmente devido a problemas de sintaxe, não tenho certeza do que precisa ser escapado e quais não.

    
por user48020 04.10.2013 / 14:13

3 respostas

4
sed -n 's|.*href="\(http://[^"]*\)">Transcript.* - \([0-9]*\)\. \(.*\)</a>|::|p'

Isso só funciona se houver apenas um link por linha.

com perl :

perl -lne 'print for m|href="(http://.*?)">Transcript.*? - (\d*)\. (.*?)</a>|g'
    
por 04.10.2013 / 14:26
1

Uma solução bash nativa pode funcionar para você. Isso combina a linha inteira com a expressão regular, portanto, funcionará apenas com um link por cenários de linha

pat='href="(http://.*)">Transcript.* - ([0-9]*)\. (.*)</a>'
while IFS= read -r line; do 
   [[ $line =~ $pat ]] && 
   echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]}"
done <file.txt
    
por 04.10.2013 / 16:26
1

O grep só pode imprimir a linha inteira ou a parte que correspondeu ao padrão único (ou ao nome do arquivo, eu acho). No entanto, desde que você esteja usando um regex perl, você pode tentar pcregrep, que tem um parâmetro opcional adicional para o sinalizador -o, especificando o grupo entre parênteses para mostrar. Como em

sauer@humpy:~$ echo ab12cd34ef | pcregrep -o1 '.*?(\d+).*?(\d+).*'
12
sauer@humpy:~$ echo ab12cd34ef | pcregrep -o2 '.*?(\d+).*?(\d+).*'
34

Infelizmente, você não pode especificar várias opções -o (provavelmente porque você precisaria de um separador e as coisas ficariam feias). Mas se você está fazendo algo simples, eu suponho que você poderia repetir o pcregrep várias vezes.

Observe também que não pode haver espaço entre o "o" e o número de correspondência no comando, pois -o sem argumento se comporta da mesma forma que grep normal.

Pessoalmente, eu usaria o perl.

sauer@humpy:~$ echo ab12cd34ef | perl -plne 's/^.*?(\d+).*?(\d+).*$/$1:$2/'
12:34
    
por 06.10.2013 / 20:56

Tags