Este não é um trabalho particularmente bom para sed
, mas aqui vai:
sed -nr 's#.*/([^"]+).jpg.*##p' file
O texto acima mostra uma lista de números, um por linha:
20
20
32
32
32
30
30
30
Agora, é realmente possível colocar todos esses itens na mesma linha com 7 números por linha usando sed
, mas não vale a pena o esforço. Apenas use as ferramentas padrão * nix:
$ echo $(sed -nr 's#.*/([^"]+).jpg.*##p' file | tr $'\n' ' ') | fold -sw 21
20 20 32 32 32 30 30
30
Ou, se você quiser remover duplicatas:
echo $(sed -nr 's#.*/([^"]+).jpg.*##p' file | sort -u | tr $'\n' ' ')
20 30 32
Explicação
O comando sed
usa alguns truques:
-
-n
: não imprima linhas por padrão. -
-r
: ativar expressões regulares estendidas, isso nos permite usar( )
para grupos de captura sem precisar fugir do parênteses e+
para "um ou mais". -
s#from#to#
: enquanto o operador de substituição padrão emsed
e outras ferramentas semelhantes és/from/to/
, você pode um delimitador não padrão para incluir/
no padrão. Nesse caso, estou usando#
, mas você também pode usar outra coisa comos|from|to|
. -
s#.*/([^"]+).jpg.*##p
: isso vai combinar tudo desde o começo da linha até um/
e, em seguida, captura o trecho mais longo de caracteres que não são"
até.jpg
. Este é o nome do arquivo menos extensão. O nome do arquivo é capturado nos parênteses e a linha inteira (por causa do.*
em ambos os lados) será substituída pelo padrão capturado (). O
p
no final significa que ele imprimirá as linhas onde a substituição foi bem-sucedida.
Pessoalmente, eu teria feito tudo isso com perl
em primeiro lugar:
$ perl -e '@k=grep(s/.*\/([^"]+).jpg.*//s,<>); print "@k[0..6]\n@k[7..$#k]\n"' file
20 20 32 32 32 30 30
30
Ou, para um arquivo maior:
$ perl -e '@k=grep(s/.*\/([^"]+).jpg.*//s,<>); for($i=0;$i<=$#k;$i+=7){print "@k[$i..$i+7]\n"}' file
20 20 32 32 32 30 30 30
30
Ou grep
mesmo:
$ echo $(grep -oP '[^/]+(?=.jpg)' file | tr $'\n' ' ' ) | fold -w 21
20 20 32 32 32 30 30
30
Ou, roubando a idéia inteligente de xargs
do Olli:
$ grep -oP '[^/]+(?=.jpg)' file | xargs -n7 echo
20 20 32 32 32 30 30
30