Answers:
从xargs
手册中:
如果希望输入参数包含空格或水平制表符,请用双引号或撇号将其引起来。如果参数包含双引号字符(
"
),则必须将参数括在撇号中。相反,如果参数包含撇号('
),则必须将参数用双引号引起来。您还可以\
在字符前面加上反斜杠(),以告诉xargs忽略字符可能具有的任何特殊含义(例如,空格字符或引号)。
这意味着如果引号本身被引用,则可以转义:
$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'
将工作,但echo /Place/=\'http://www.google.com\' | xargs echo
不会。
"/Place/='http://www.google.com'"
如何正确对其进行转义?
如果你想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$
您可以改用GNU Parallel:
$ echo "/Place/='http://www.google.com'" | parallel echo
/Place/='http://www.google.com'
然后,您不必自己报价。
了解更多:https : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1
我在联机帮助页中找到了另一种解决方案:将分隔符明确指定为'\ n'。这将关闭对报价的特殊处理:
--delimiter = delim,-d delim
输入项目以指定字符终止。指定的分隔符可以是单个字符,C样式字符转义符(例如\ n)或八进制或十六进制转义码。八进制和十六进制转义码被理解为printf命令。不支持多字节字符。处理输入时,引号和反斜杠并不特殊;输入中的每个字符均按字面意义使用。
所以,
echo "/Place/='http://www.google.com'" | xargs -d'\n' echo
输出
/Place/='http://www.google.com'
xargs
或兼容
我在这里/programming//a/17468560/1795821找到了另一个解决方案,建议使用sed
转义引号。
例如:
sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
xargs
引号和反斜杠特别作为规范的一部分。张贴您想做的事xargs
。