Como posso suprimir o espaço entre os argumentos gerados durante a expansão de chaves?

8

Eu usei o seguinte comando para criar uma lista de URLs que eu quero testar:

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Infelizmente, os URLs anexados a urls.txt tinham um espaço antes deles (com exceção do primeiro, é claro). Eu entendo por que isso aconteceu, e percebo que eu poderia desmembrá-lo usando a expressão sed , mas gostaria de saber se há uma maneira de suprimi-lo. (Pode parecer bobo e pedante, mas não é diferente da preferência que muitas pessoas sentem por "não abusar de gatos" a>.)

Eu tentei dobrar aspas para suprimir a divisão de palavras , mas isso também suprimiu a expansão de chaves, então isso foi um problema vai.

Eu tentei alterar o IFS para uma string vazia, mas também não funcionou:

IFS='' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Também não foi alterado para uma nova linha:

IFS='\n' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt
    
por iconoclast 24.07.2014 / 16:57

4 respostas

8

Você pode armazenar a expansão da chave em uma matriz e, em seguida, enviá-la da maneira que você escolher:

urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )

Então

printf "%s\n" "${urls[@]}"

ou

(IFS=$'\n'; echo "${urls[*]}")

O exemplo echo parece estranho porque:

  1. ele é executado em um subshell (os parênteses), portanto, não altero meu valor atual do IFS.
  2. O IFS precisa ser definido em um comando separado:
    • Isso não funciona: IFS=$'\n' echo "${urls[*]}" porque a variável é expandida antes de a nova variável env entrar em vigor
    • O IFS precisa ser definido antes para você começar a expandir as variáveis.

Além disso, observe a diferença sutil no índice da matriz de referência usada:

  • [@] no exemplo printf para expandir o array em palavras individuais
  • [*] no exemplo de eco para expandir a matriz em uma única palavra, com elementos separados pelo primeiro caractere do IFS
por 24.07.2014 / 17:27
16

Use printf construído em:

$ printf %s\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....
    
por 24.07.2014 / 17:05
6

Isso é marcado como zsh, então sugiro o zsh builtin print :

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l imprime argumentos em linhas separadas.

    
por 24.07.2014 / 17:04
3

O problema é que a expansão da chave está adicionando o espaço, e o echo está adicionando a nova linha. Portanto, usando o princípio da responsabilidade única, manuseie a nova linha separadamente.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"
    
por 24.07.2014 / 17:13