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
vê
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/ /'