私が知る限り、$&
これが最後に見つかったキャプチャグループです。キャプチャグループが1つしかない場合、同じ2つの変数を返すのはどうですか?たとえば、
$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$1\"/; print;"
"": value
$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$&\"/; print;"
"key": value
答え1
perl
特殊変数はに記録されますperldoc perlvar
。
ポケットベルがある場合はless
(行の先頭で)検索して関連セクションにアクセスできます。$&
^\s*\$&
$&
または、perldoc -v '$&'
変数の特定の部分を抽出するには、次のようにします$&
。
$& The string matched by the last successful pattern match (not counting any matches hidden within a BLOCK or "eval()" enclosed by the current BLOCK). See "Performance issues" above for the serious performance implications of using this variable (even once) in your code. This variable is read-only and dynamically-scoped. Mnemonic: like "&" in some editors.
したがって、これには、キャプチャグループでキャプチャされたコンテンツは含まれず、正規表現全体が一致するものも含まれます。
とにかく、あなたの質問$1
はシェルに拡張最初の位置引数(あなたの場合は設定されていないように見えます)は、シェルで有効な変数名ではない$&
ため、単独で残されます。$&
内部的に一重引用符を使用しようとしていますが、これは$
シェルで特別な意味を失います。
echo 'key: value' | perl -pe 's/([a-z]+):/"$1":/'
echo 'key: value' | perl -pe 's/[a-z]+(?=:)/"$&"/'
より一般的には、ほぼ常に単一(強いperl
)または他の言語ソルバーのコードパラメータ(sed -e
、、、、awk
...)に関連しています。これらの言語には通常、シェルにも特殊な文字が含まれているだけでなく、そうしないとシェル拡張(最初の位置引数でここで拡張するなど)を行うと、これがコード注入の脆弱性になる可能性があります(ここに含まれる場合何が起こるか考えてみてください)。python -c
sh -c
$1
$1
/;system "reboot" #