Imprime argumentos para printf em nenhuma ordem específica

3

Como posso me referir aos argumentos de coreutil ' printf em nenhuma ordem específica?

Isso é o que eu quero evitar:

$ printf '%s %s %s %s %s %s %s' a c a c b c a
a c a c b c a

Isso é o que eu gostaria de fazer:

$ printf '%s %s³ %s¹ %s³ %s² %s³ %¹' a b c
a c a c b c a

Isto é como fazê-lo com o Perl.

perl -e 'printf ("%s %3\$s %1\$s %3\$s %2\$s %3\$s %1\$s\n", 'a', 'b', 'c');'
a c a c b c a

Observe apenas quatro argumentos são passados para printf .

    
por n.r. 05.07.2013 / 18:05

2 respostas

2

Printf no bash não tem essa opção implementada.

Mas uma solução simples é usar variáveis:

$ a=a b=b c=c
$ printf '%s %s %s %s %s %s %s\n' "$a" "$c" "$a" "$c" "$b" "$c" "$a"
a c a c b c a

Ou até mesmo os parâmetros posicionais:

$ set -- a b c
$ printf '%s %s %s %s %s %s %s\n' "$1" "$3" "$1" "$3" "$2" "$3" "$1"
a c a c b c a
    
por 22.11.2016 / 05:11
1

Não há uma maneira interna de fazer isso que consegui encontrar. Você sempre pode gerar os argumentos em um loop como este:

para loop

$ printf '[ -d %s ] || mkdir %s; cd %s\n' 'for run in {1..3}; do echo "$dir";done'

Pequena variância:

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(for run in {1..3}; do echo "$dir";done)

Você pode controlar o número de argumentos alterando esta parte do comando {1..3} .

seq & xargs

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(seq 1 3 | { xargs -i -- echo "$dir"; })

Isso criará um seq de números, de 1 a 3, e isso controlará quantas vezes o {xargs -i ...} será executado.

sim

Graças ao comentário do @rici, você também pode usar essa construção, yes ... | head -n 3 :

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(yes "$dir" | head -n 3)

Referências

por 05.07.2013 / 18:19