web-dev-qa-db-ja.com

xargsが入力から引用符を取り除くのはなぜですか?

Xargsが入力テキストから引用符を取り除くのはなぜですか?

これは簡単な例です:

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

出力

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

これを回避する方法はありますか? (xargs -0は私を助けません)

28
ddario

xargsマニュアルから:

入力引数に空白または水平タブを含める場合は、二重引用符またはアポストロフィで囲みます。引数に二重引用符(")、引数をアポストロフィで囲む必要があります。逆に、引数にアポストロフィ(')、引数を二重引用符で囲む必要があります。バックスラッシュ(\)文字の前に置き、xargsにその文字が持つ可能性のある特別な意味(空白文字、引用符など)を無視するように指示します。

つまり、引用符自体が引用符で囲まれている場合は、引用符をエスケープできます。

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

動作しますがecho /Place/=\'http://www.google.com\' | xargs echo しない。

10
Matteo

xargs引用符を無視したい場合は、xargsフラグを使用するとよいでしょうxargs -

マニュアルページから直接

オプション-0、-null

入力項目は空白文字ではなく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$ 
23
Balman Rawat

マンページで別の解決策を見つけました:区切り文字を明示的に '\ 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'
10
fungusakafungus

代わりにGNU Parallelを使用できます:

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

その後、自分で引用する必要はありません。

詳細: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

8
Ole Tange

私はここに別の解決策を見つけました https://stackoverflow.com/a/17468560/1795821sedを使用して引用符をエスケープすることを提案しています。

例えば:

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