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 emsede 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 (). Opno 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