'Binding' Bash Curly Suspensórios

3

No Bash,

echo a{b,c}d{e,f}

imprime

abde    abdf    acde    acdf

A saída que eu gostaria de ver é

abde    acdf

Em outras palavras, dados os parâmetros N , eu gostaria que o Bash usasse o parâmetro i dentro de cada par de chaves para construir N cordas.

    
por Isaac Kleinman 23.10.2013 / 02:34

3 respostas

3

Eu faria isso com matrizes:

$ foo=( b c ); bar=( e f ); for i in {0..1}; do echo a${foo[$i]}d${bar[$i]}; done
abde
acdf

Assumo que o seu caso de uso real é um pouco mais complexo, por isso, se você preencher os arrays usando outro comando e não conhecer necessariamente o tamanho deles, use:

foo=( b c ); bar=( e f ); for i in $(seq 0 $((${#foo[@]}-1))); do 
   echo a${foo[$i]}d${bar[$i]}; 
done
    
por 23.10.2013 / 03:23
0

Esta é uma resposta boba, mas aqui está mesmo assim:

$ echo a{b,c,d}e{f,g,h} | awk 'BEGIN {N=3;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1}e{f,g,h,2} | awk 'BEGIN {N=4;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1,A}e{f,g,h,2,Z} | awk 'BEGIN {N=5;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'
    
por 23.10.2013 / 03:21
0

Você não pode alterar a maneira como as chaves funcionam.

Se houver uma string que não aparece no texto, digamos , , você pode aplicar sucessivas substituições de string a uma matriz:

a=(,b,e @c,f)
a=("${a[@]/,/a/}")
a=("${a[@]/,/d}")
echo "${a[@]}"

Um loop seria mais claro. Se você quiser juntar as peças, você pode usar um separador que não aparece nas seqüências, digamos , , o que seria especial dentro de chaves de qualquer maneira.

a=(); IFS=,; set -f
for x in b,e c,f; do
  a+=(a${x%*,}d${x#*,})
done

Outra abordagem é definir duas matrizes paralelas.

version=(test main)
files=(AppTest.java App.java)
for ((i=0; i<${#files}; i++) rm "src/$version[i]/java/org/sonatype/mavenbook/files[i].java"

Acho que a maneira mais fácil de lidar com esse comando específico seria definir uma função.

rmapp () { rm "src/$1/java/org/sonatype/mavenbook/$2.java"; }
    
por 23.10.2013 / 18:06