내가 아는 한, $&
이것이 마지막으로 발견된 캡처 그룹입니다. 캡처 그룹이 하나만 있는 경우 동일한 두 변수를 반환하는 것은 어떨까요? 예를 들어:
$ 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" #