매우 간단한 가상의 질문입니다.
한계에 도달했으며 조건부 대체를 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