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

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

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

以下は簡単な例です。

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

出力

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

この問題を解決する方法はありますか? (xargs -0は私には役に立ちませんでした)

答え1

欲しいxargsなら引用符を無視良い魂の一つは、xargsロゴを使用することですxargs -0

マニュアルページオプションから直接

オプション-0、--null

入力は空白ではなくヌル文字で終わり、引用符とバックスラッシュは特別ではありません(各文字は文字通り使用されます)。他のパラメーターと同様に処理されるファイル終了文字列を無効にします。入力にスペース、引用符、またはバックスラッシュを含めることができる場合に便利です。 GNU find -print0オプションは、このパターンに適した入力を生成します。

-dオプションを使用するだけでなく、区切り文字を特定の値(newlineなど-0)に設定すると、引用符xargsなどが特別に処理されないGNUシステムを特定しました。

-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$ 

答え2

GNU xargsの場合、マンページで別の解決策を見つけました。区切り文字を "\n" で明示的に指定することです。これにより、引用符の特別な処理がオフになります。

--delimiter=delim, -d delim

入力用語は指定された文字で終わります。指定された区切り文字は、単一文字、Cスタイル文字エスケープ(\ nなど)、または8進数または16進数のエスケープコードです。 8進数と16進数のエスケープコードはprintfコマンドとして理解されます。マルチバイト文字はサポートされていません。入力を処理するときの引用符とバックスラッシュは特別ではありません。入力のすべての文字は文字通り処理されます。

だから、

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

出力

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

答え3

xargsマニュアルから:

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

これは、引用符自体が引用符で囲まれている場合に引用符をエスケープできることを意味します。

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

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

答え4

ここで別の解決策を見つけましたhttps://stackoverflow.com/a/17468560/1795821エスケープされた引用符を使用することをお勧めしますsed

たとえば、

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

関連情報