Por que o xargs tira aspas da entrada?

20

Por que os xargs extraem citações 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)

    
por ddario 08.05.2012 / 15:26

5 respostas

8

Do manual xargs :

If you want an input argument to contain blanks or horizontal tabs, enclose it in double quotes or apostrophes. If the argument contains a double quote character ("), you must enclose the argument in apostrophes. Conversely, if the argument contains an apostrophe ('), you must enclose the argument in double quotes. You can also put a backslash (\) in front of a character to tell xargs to ignore any special meaning the character may have (for example, white space characters, or quotes).

Isso significa que você pode escapar de citações se as citações forem citadas:

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

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

    
por 08.05.2012 / 15:53
14

se você quiser que xargs ignore aspas , uma das boas características pode ser o uso de xargs flag xargs -0

Directly from Man page OPTIONS

OPTIONS -0, --null

Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.

Eu verifiquei em um sistema GNU que configurar o delimitador para um valor específico (como uma nova linha) com a opção -d (e não apenas -0 ) também faria com que xargs não tratasse as cotações, etc. :

-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$ 
    
por 26.04.2017 / 06:41
6

Você poderia usar o GNU Parallel em vez disso:

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

Então você não precisa fazer as citações por conta própria.

Saiba mais: link

    
por 09.05.2012 / 16:47
5

Encontrei outra solução na página do manual: especificar explicitamente o delimitador como '\ n'. Isso desativa o tratamento especial de cotações:

--delimiter=delim, -d delim

Input items are terminated by the specified character. The specified delimiter may be a single character, a C-style character escape such as \n, or an octal or hexadecimal escape code. Octal and hexadecimal escape codes are understood as for the printf command. Multibyte characters are not supported. When processing the input, quotes and backslash are not special; every character in the input is taken literally.

Então,

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

saídas

/Place/='http://www.google.com'
    
por 05.12.2017 / 17:51
2

Eu encontrei outra solução aqui link que sugere usar sed para escapar de citações.

Por exemplo: sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\'/g" | xargs echo /Place/='http://www.google.com'

    
por 10.12.2016 / 17:14