回答:
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を無視したい場合は、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
入力項目は指定された文字で終了します。指定する区切り文字は、単一の文字、\ nなどのCスタイルの文字エスケープ、または8進数または16進数のエスケープコードです。8進および16進のエスケープコードは、printfコマンドの場合と同じです。マルチバイト文字はサポートされていません。入力を処理するとき、引用符とバックスラッシュは特別ではありません。入力内のすべての文字は文字どおりに取得されます。
そう、
echo "/Place/='http://www.google.com'" | xargs -d'\n' echo
出力
/Place/='http://www.google.com'
xargsまたは互換性
ksh93 $'...'、すべてのシェル実装にないクォート演算子の使用を回避するという点で、あなたの方がいくらか優れています。
ここで別の解決策を見つけました/programming//a/17468560/1795821sed引用符をエスケープするために使用することを提案します。
例えば:
sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
xargs引用符とバックスラッシュをspecの一部として特別に扱います。xargs代わりにあなたがやろうとしていることを投稿してください。