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


25

xargsが入力テキストから引用符を削除するのはなぜですか?

簡単な例を次に示します。

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

出力

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

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


1
xargs引用符とバックスラッシュをspecの一部として特別に扱います。xargs代わりにあなたがやろうとしていることを投稿してください。
jw013

3
xargs -0ここで私のために働いています...なぜそれがあなたを助けないのですか?
デロバート

回答:


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 | parallel --shellquote | ...
オーレ丹下

19

引用符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$ 


7

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

それはGNU含意することに注意してくださいxargsまたは互換性
ステファンChazelas

また、スペースとタブが区切り文字として認識されないようにすることにも注意してください(OPの場合も同様です)。
ステファンシャゼル

Balmanは同様のソリューションを提供しました実際には@imzです)がksh93 $'...'、すべてのシェル実装にないクォート演算子の使用を回避するという点で、あなたの方がいくらか優れています。
ステファンシャゼル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.