0

これは、括弧で定義されたグループだけをキャプチャして出力することを期待していましたが、代わりに行全体を出力します。括弧内のグループだけをキャプチャして印刷するにはどうすればよいですか?

echo "abcdef" | perl -ne "print $1 if /(cd)/ "

これを印刷したいもの:cd

実際に印刷されるもの:abcdef

直し方?

4

2 に答える 2

2

perl コマンドでは、単一引用符を使用するか、変数を保護する必要があります。

echo "abcdef" | perl -ne "print \$1 if /(cd)/"

また

echo "abcdef" | perl -ne 'print $1 if /(cd)/'

二重引用符で囲むと、シェルは $1 を展開します。

于 2013-07-10T18:36:56.297 に答える
1

質問に対する即時の修正は、次のように二重引用符を単一引用符に変更することです。

       $ echo abcdef | perl -ne 'print $1 if /(cd)/'
       cd

二重引用符を使用すると、シェル環境は保護されていない変数 $1 を解釈します。これは、環境では明らかに空の文字列に評価されます。したがって、perl は、行全体を出力print if /(cd)/する暗黙のコマンドであるコマンドのみを受け取ります。print $_ if /(cd)/

次のように保護された変数を使用することもできます。

       $ echo abcdef | perl -ne "print \$1 if /(cd)/"
       cd

異なる区切り文字 (/ および / 以外) を使用する一致はm、省略形を使用するのではなく、キーワードで開始する必要があることに注意してください。しかし、あなたの場合、これは問題ではありませんが、m|/| などのように、一致を操作するときに注意する価値があることがよくあります。/正規表現の区切り文字としてパイプを使用して文字に一致します。

于 2013-07-10T18:33:34.010 に答える