Perl을 사용한 조건부 대체

Perl을 사용한 조건부 대체

매우 간단한 가상의 질문입니다.

한계에 도달했으며 조건부 대체를 sed위해 sed스크립트를 perl.sed

sed '/condition/ s/xx/yy/'

Perl에서 어떻게 구현하나요?

예를 들어 Perl에서 다음을 수행하는 방법은 무엇입니까?

seq 6 > /tmp/tf

$ paste -d '' /tmp/tf /tmp/tf | sed -E '/[135]/s/^(.)(.)$/\1.\2-/'
1.1-
22
3.3-
44
5.5-
66

$ paste -d '' /tmp/tf /tmp/tf | perl -pe 's/$&/$1.$2-/ if /^([135])(.)$/'
.-
22
.-
44
.-
66

답변1

목표가 입력을 줄이고 Perl 및 sed.sed

sed '/^\([135]\)\(.\)$/ s//\1.\2-/'
perl -pe '/^([135])(.)$/ && s//$1.$2-/'

명령의 빈 정규식은 s///이전 테스트의 표현식(일반적으로 가장 가까운 일치 표현식)을 재사용합니다.

&&Perl에서는 테스트와 교체 사이에 단락 회로 명령문처럼 작동하도록 추가 해야 합니다 if. 에서 sed첫 번째 표현식은 단순히 다음과 같이 작동합니다.주소교체 명령.

일반적으로 말하면,

sed '/condition/ s/xx/yy/'

..."동일"합니다(약간 다른 구문과 정규식 스타일을 고려).

perl -pe '/condition/ && s/xx/yy/'

하지만 이 경우 대체 항목을 직접 적용하는 것이 더 간단합니다.

sed 's/^\([135]\)\(.\)$/\1.\2-/'
perl -pe 's/^([135])(.)$/$1.$2-/'

답변2

문제는 $1등이 모든 새로운 정규식에서 재설정되므로 명령에서 반복하지 않는 한 비어 있다는 것입니다 s.

s/^([135])(.)$/$1.$2-/ if /^([135])(.)$/'

다음을 제거하여 단순화할 수 있습니다 if.

s/^([135])(.)$/$1.$2-/

보다 일반적인 경우에는 캡처된 값을 유지할 수 있습니다.

if (/^([135])(.)$/) { $a=$1; $b=$2; s/$&/$a.$b-/; }

답변3

사용행복하다(이전 Perl_6)

raku -pe 's/^ (<[135]>) (.) $/$0.$1-/;'  

또는

raku -pe 's/^ (.) (.) $/$0.$1-/ if  m/^ <[135]> /;'  

#Immediately above being a re-arrangement of:

raku -pe 'if m/^ <[135]> /  {s/^ (.) (.) $/$0.$1-/};' 

Raku를 사용하는 Perl 사용자에게 도움이 되길 바라는 마음으로 이 글을 게시합니다. 캡처가 시작되는 Raku에서는 ... 표기법 $0을 사용하여 문자 클래스가 생성됩니다 (대괄호는 그룹화를 위해 단독으로 예약되어 있습니다). 그리고 일치는 일반적으로 공백(즉, Perl5의 기본값)을 구분하지 않습니다.<[]>\x

@Kusalananda의 첫 번째 Perl5 코드 예제(위의 Raku 'accent' 사용)를 시도하면 Raku 오류가 발생합니다 Null regex not allowed. 따라서 위의 첫 번째 Raku 답변은 @Kusalananda의 답변과 더 비슷해 보입니다.마지막Perl5 코드 예제. (위의 두 번째 Raku 답변은 if조건문을 사용하는데, 일부 사용자는 이를 더 읽기 쉽게 찾을 수 있습니다.)

입력 예:

11
22
33
44
55
66

예제 출력:

1.1-
22
3.3-
44
5.5-
66

부록: OP가 연결을 위한 샘플 데이터를 게시한 이후정확히 똑같다숫자 - 여기에 답이 없는 질문이 있는지 궁금합니다.역참조. Raku에서 일치의 첫 번째 캡처(예: 연산자 왼쪽 s///)를 재사용하려면 다음을 수행할 수 있습니다.

raku -pe 's/^ (<[135]>) $0 $/$0.$0-/;'  

또는

raku -pe 's{^ (<[135]>) $0 $} = "$0.$0-";'  

또는 (아래에서 캡처라고 함):

raku -pe 's/^ $<myOdd>=<[135]> $<myOdd> $/$<myOdd>.$<myOdd>-/;' 

또는

raku -pe 's{^ $<myOdd>=<[135]> $<myOdd> $} = "$<myOdd>.$<myOdd>-";'  

위의 두 번째 및 네 번째 예에서는 Raku의 새로운 "대체 할당" 표기법을 사용합니다. 이 표기법은 (가독성을 높이기 위해) 괄호, 중괄호 등 다양한 구분 기호를 사용할 수도 있습니다. (물론 if앞서 표시된 것처럼 별도의 조건) 섹션, 하지만 이로 인해 코드의 가독성이 떨어질 수 있습니다.)

https://raku.org/archive/rfc/144.html
https://raku.org/archive/rfc/331.html
https://raku.org

관련 정보