perl
명령줄에서 패턴 일치에 대한 일부 산술을 사용하려고 합니다. 한 게임에서는 할 수 있지만 모든 게임에서 할 수는 없습니다.
str="a1b2c3"
perl -pe 's/\d+/$&+1/e' <<<"$str"
a2b2c3
나는 이것이 $&
첫 번째 일치하는 숫자를 의미한다는 것을 이해합니다 1
. 1
모든 숫자를 더 하려면 어떻게 해야 하나요 ? $&
일치하는 모든 패턴을 나타내는 유사한 변수가 있습니까 ? 또는 여러 숫자와 일치하도록 정규식을 수정해야 합니다.
주어진 입력에 대해 출력은 다음과 같을 것으로 예상됩니다.
a2b3c4
답변1
str="a1b2c3"
perl -pe 's/\d+/$&+1/ge' <<<"$str"
g
교체된 플래그는 Perl이 입력 라인에서 겹치지 않는 모든 일치 항목에 표현식을 적용하도록 합니다.
Nitpicky: 실제로 여기에 관련된 캡처 그룹은 없습니다(원래 질문에서는 캡처 그룹을 언급했습니다.). Perl 변수 $&
는 "마지막으로 성공한 패턴 일치와 일치하는 문자열"입니다. 이는 해당 캡처링 그룹(대괄호 표현)과 일치하는 문자열을 참조하는 eg $1
및 etc 와는 다릅니다 . $2
에는 캡처링 그룹이 없지만 단일 캡처링 그룹을 사용하는 \d+
이를 대신 사용할 수 있습니다 .s/(\d+)/$1+1/ge
결과적으로는 s/(\d+)/$1+1/ge
별 차이가 없습니다. 이 짧은 인라인 Perl 스크립트에서는 둘 중 하나를 선택하든지 차이가 없습니다. 그러나 일반적으로 많은 정규식 조작을 수행하는 긴 Perl 프로그램에서는 적어도 이전 스크립트를 사용하는 경우에는 s/\d+/$&+1/ge
이를 피하고 싶습니다. $&
Perl은 그대로 출시되었습니다.
perldoc perlvar
(내 강조점) 에서 :
성능 문제
전통적으로 Perl에서는 코드의 어느 곳에서나 이 세 가지 변수 또는 이에 상응하는 변수를 사용합니다
$`
.$&
$'
use English
이후의 모든 성공적인 패턴 일치가 일치하는 문자열의 복사본을 생성하도록 합니다., 코드가 이후에 이러한 변수 중 하나에 액세스하는 경우. 이로 인해 전체 프로그램에 상당한 성능 저하가 발생하므로 일반적으로 이러한 변수를 사용하지 않는 것이 좋습니다.[...]
Perl 5.20.0에서는 새로운 Copy-On-Write 시스템이 기본적으로 활성화되어 있습니다.마침내 이 세 가지 변수의 성능 문제를 모두 해결했습니다., 어디에서나 안전하게 사용할 수 있도록 하세요.
답변2
zsh
실제로 쉘( <<<
에서 유래했지만 이후 여러 다른 쉘에 복사된 비표준 연산자 )을 사용하는 경우 이를 위해 이를 호출 zsh
할 필요가 없습니다 .perl
넌 할 수있어:
set -o extendedglob # for (#m) below
printf '%s\n' ${str//(#m)<->/$((MATCH+1))}
어디
(#m)
전체 일치 캡처를 켭니다 ( s$MATCH
와 동일 ).perl
$&
<->
임의의 10진수 시퀀스와 일치합니다(비슷<5-12>
하지만 제한 사항은 없음).