これは、括弧で定義されたグループだけをキャプチャして出力することを期待していましたが、代わりに行全体を出力します。括弧内のグループだけをキャプチャして印刷するにはどうすればよいですか?
echo "abcdef" | perl -ne "print $1 if /(cd)/ "
これを印刷したいもの:cd
実際に印刷されるもの:abcdef
直し方?
perl コマンドでは、単一引用符を使用するか、変数を保護する必要があります。
echo "abcdef" | perl -ne "print \$1 if /(cd)/"
また
echo "abcdef" | perl -ne 'print $1 if /(cd)/'
二重引用符で囲むと、シェルは $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|/| などのように、一致を操作するときに注意する価値があることがよくあります。/
正規表現の区切り文字としてパイプを使用して文字に一致します。