Saída inesperada de xargs

0

A declaração abaixo deve imprimir afc abc , mas imprime abc abc . Tentei muitas vezes, mas sempre o mesmo resultado. Não sei por que isso acontece, alguém poderia me explicar e me ajudar?

bash echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}

    
por Kian Ostad 15.07.2018 / 10:21

1 resposta

2

Sim, porque a substituição do comando é executada pelo shell antes que o xargs seja iniciado. O echo na substituição imprime a string literal {} para sed para manipular. sed não faz alterações, e o resultado é que xargs

echo {} {}

Em vez disso:

echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

Aqui, evitamos que o shell avalie a substituição do comando incorporando-o em um script in-line. O script recebe o argumento de linha de comando ( abc ) de xargs e o manipula como "$1" .

Seria ainda melhor usar printf caso você tivesse a idéia de substituir o a por um traço e os outros caracteres por algo que seria interpretado como uma opção para echo :

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

Ou, sem sed :

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}

Ou, você poderia fazer isso apenas com sed (pelo menos neste exemplo simples):

echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'
    
por 15.07.2018 / 10:31