再帰(ネスト)grepが「無効な文字範囲」エラーを発生させます。

再帰(ネスト)grepが「無効な文字範囲」エラーを発生させます。

ファイルがありますtest.xml(下記参照)。このgrepの仕組みは次のとおりです。

grep '<appointment-id internal:ref=1.2.3/>' test.xml

出力は次のとおりです

    <appointment-id internal:ref=1.2.3/>

しかし、これは失敗します。

grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml

出力は次のとおりです

grep: invalid character range

コンテンツtest.xml:

<note>
    <to>Jim</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Some text</body>
    <appointment-id internal:ref=1.2.3/>
</note>

grepこれら2つのコマンド(単純なコマンドとネストしたコマンド)を使用してスクリプトに入れましたset -x。以下は、スクリプトを正確にコピーして貼り付けたものです。

set -x
grep '<appointment-id internal:ref=1.2.3/>' test.xml
grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml
exit 0

出力は次のとおりです。

++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
    <appointment-id internal:ref=1.2.3/>
+++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
++ grep '    <appointment-id internal:ref=1.2.3/>' test.xml
grep: invalid character range
++ exit 0

答え1

grep出力が端末でなくても(内部的に)カラー出力を生成します。環境変数がに設定されている場合は、GREP_COLORこれを行うことができますalways

シェーディング制御コードには、外部から入力したときにgrep文字範囲として解釈される文字が含まれています。

このパターンは、文字範囲として解釈されても効果はありません。

grep--color=never回避策は、適切な環境変数()を明示的に使用または設定して出力の色付けを無効にすることですGREP_COLOR=never

これを設定すると、例ではexternalのように端末に書き込むときにカラー出力のみを生成する必要がありますが、innerの場合はGREP_COLOR=autoそうでgrepはありません。grepgrep

関連情報