모든 패턴 일치를 수정하는 Perl 명령줄 정규 표현식

모든 패턴 일치를 수정하는 Perl 명령줄 정규 표현식

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>하지만 제한 사항은 없음).

관련 정보