回答:
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
代わりにあなたがやろうとしていることを投稿してください。