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'
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.
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
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