Por que xargs retira aspas da entrada?


25

Por que xargs retira aspas do texto de entrada?

Aqui está um exemplo simplificado:

echo "/Place/='http://www.google.com'" | xargs echo

saídas

/Place/=http://www.google.com

Existe alguma maneira de contornar isso? (xargs -0 não me ajuda)


1
xargstrata aspas e barras invertidas especialmente como parte das especificações . Poste o que você está tentando fazer xargs.
Jw013

3
xargs -0funciona para mim aqui ... Por que não ajuda?
derobert

Respostas:


10

Do xargsmanual:

Se você deseja que um argumento de entrada contenha espaços em branco ou guias horizontais, coloque-o entre aspas ou apóstrofos. Se o argumento contiver um caractere de aspas duplas ( "), você deverá colocar o argumento entre apóstrofos. Por outro lado, se o argumento contiver um apóstrofo ( '), você deverá colocar o argumento entre aspas duplas. Você também pode colocar uma barra invertida ( \) na frente de um caractere para dizer ao xargs para ignorar qualquer significado especial que o caractere possa ter (por exemplo, caracteres de espaço em branco ou aspas).

Isso significa que você pode escapar de aspas se as aspas forem citadas:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

vai funcionar, mas echo /Place/=\'http://www.google.com\' | xargs echonão vai.


1
Nada contra votos para baixo, mas um comentário sobre a razão ajudaria :-)
Matteo

3
E se você estiver inserindo entradas? Se eu tenho um script que gera "/Place/='http://www.google.com'", como posso escapar corretamente dele?
Roger Filmyer 07/07

1
@RogerFilmyer your_script | paralelo --shellquote | ...
Ole Tange

19

se você quiser xargspara ignorar cita um dos bons soultion pode ser o uso de xargsbandeira xargs -0

Diretamente da página do manual

OPÇÕES -0, --nula

Os itens de entrada são finalizados por um caractere nulo em vez de por espaço em branco, e as aspas e a barra invertida não são especiais (todos os caracteres são literalmente). Desativa o final da sequência de arquivos, que é tratada como qualquer outro argumento. Útil quando itens de entrada podem conter espaço em branco, aspas ou barras invertidas. A opção GNU find -print0 produz entradas adequadas para este modo.

Eu verifiquei em um sistema GNU que definir o delimitador para um valor específico (como uma nova linha) com a -dopção (e não apenas -0) também causaria xargsnão tratar as aspas, etc. especialmente:

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 


7

Encontrei outra solução na página de manual: especifique explicitamente delimitador como '\ n'. Isso desativa o tratamento especial para aspas:

--delimiter = delim, -d delim

Os itens de entrada são finalizados pelo caractere especificado. O delimitador especificado pode ser um único caractere, um escape de caractere no estilo C, como \ n, ou um código de escape octal ou hexadecimal. Os códigos de escape octais e hexadecimais são entendidos como para o comando printf. Caracteres multibyte não são suportados. Ao processar a entrada, aspas e barra invertida não são especiais; todo caractere na entrada é interpretado literalmente.

Tão,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

saídas

/Place/='http://www.google.com'

Observe que isso implica em GNU xargsou compatível #
Stéphane Chazelas

Observe também que também impede que o espaço e a guia sejam reconhecidos como delimitadores (provavelmente também no caso do OP).
Stéphane Chazelas

Balman deu uma solução semelhante ( na verdade, @imz ), embora a sua seja um pouco melhor, pois evita o uso do ksh93 $'...'operador de citação que não é encontrado em todas as implementações de shell.
Stéphane Chazelas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.