为什么xargs去除输入中的引号?


25

为什么xargs会去除输入文本中的引号?

这是一个简化的示例:

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

输出

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

有什么办法可以解决此问题?(xargs -0对我没有帮助)


1
xargs引号和反斜杠特别作为规范的一部分。张贴您想做的事xargs
2012年

3
xargs -0在这里为我工作...为什么对您没有帮助?
derobert

Answers:


10

xargs手册中:

如果希望输入参数包含空格或水平制表符,请用双引号或撇号将其引起来。如果参数包含双引号字符("),则必须将参数括在撇号中。相反,如果参数包含撇号('),则必须将参数用双引号引起来。您还可以\在字符前面加上反斜杠(),以告诉xargs忽略字符可能具有的任何特殊含义(例如,空格字符或引号)。

这意味着如果引号本身被引用,则可以转义:

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

将工作,但echo /Place/=\'http://www.google.com\' | xargs echo不会。


1
没有反对的任何反对,但对原因的评论将有所帮助:-)
Matteo

3
如果要输入管道怎么办?如果我有一个输出脚本,我该"/Place/='http://www.google.com'"如何正确对其进行转义?
罗杰·菲耶尔

1
@RogerFilmyer your_script | 并行--shellquote | ...
Ole Tange

19

如果你想xargs忽略行情好soultion的一个可以使用的xargs标志xargs的-0

直接来自手册页选项

选项-0,--null

输入项目以空字符而不是空格终止,并且引号和反斜杠不是特殊的(每个字符均按字面意义使用)。禁用文件字符串的结尾,该字符串与其他任何参数一样对待。输入项可能包含空格,引号或反斜杠时很有用。GNU find -print0选项产生适合此模式的输入。

我在GNU系统上检查过,使用-d选项(而不仅仅是-0)将定界符设置为特定值(例如换行符)也会导致xargs不对引号等进行特殊处理:

-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

我在联机帮助页中找到了另一种解决方案:将分隔符明确指定为'\ n'。这将关闭对报价的特殊处理:

--delimiter = delim,-d delim

输入项目以指定字符终止。指定的分隔符可以是单个字符,C样式字符转义符(例如\ n)或八进制或十六进制转义码。八进制和十六进制转义码被理解为printf命令。不支持多字节字符。处理输入时,引号和反斜杠并不特殊;输入中的每个字符均按字面意义使用。

所以,

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

输出

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

请注意,这意味着GNU xargs或兼容
斯特凡Chazelas

还要注意,它还会阻止将空格和制表符识别为定界符(在OP的情况下可能也是如此)。
斯特凡Chazelas

Balman提供了一个类似的解决方案实际上是@imz),尽管您的解决方案要好一些,因为它避免使用ksh93 $'...'在每个shell实现中都找不到的引用运算符。
斯特凡Chazelas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.