![vim 교체와 perl 파이 교체 간 변환](https://rvso.com/image/1316127/vim%20%EA%B5%90%EC%B2%B4%EC%99%80%20perl%20%ED%8C%8C%EC%9D%B4%20%EA%B5%90%EC%B2%B4%20%EA%B0%84%20%EB%B3%80%ED%99%98.png)
그래서 다음을 포함하는 test.txt 파일이 있습니다.
home -> range
vim에서 파일을 편집하고 명령을 실행하면 %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
파일이 다음으로 변환됩니다.
range ::= home ;
그게 내가 원하는 거야. 그러나 내가 달리면
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
나는 똑같이 해야 한다고 생각하는데 아무런 변화가 없습니다. 누군가 무엇이 잘못되었는지 말해 줄 수 있습니까? 뭔가 이스케이프가 필요하다고 생각하지만 이스케이프의 모든 조합을 시도했습니다. 또한 두 형식 간의 변환에 대한 몇 가지 일반적인 규칙을 원합니다...
답변1
Perl에서는 캡처링 괄호를 벗어나지 않으며 캡처 변수에 \1,\2 대신 $1,$2를 사용하는 것이 일반적입니다.
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
인생의 불행한 현실은정규 표현식많은 일반적인 도구(vim, sed, awk, perl)에서 사용되는 (RE)는 모두 미묘하게 다릅니다. 일부 도구에는 Perl RE, POSIX Basic RE(BRE) 또는 POSIX Extended RE(ERE)를 사용하는 옵션이 있습니다.
perldoc perlre
대체 표현식의 대체 부분에서 $1
vs 에 대해 다음과 같이 말합니다.\1
어떤 사람들은 다음과 같은 글을 쓰는 데 너무 익숙해졌습니다.
$pattern =~ s/(\W)/\\\1/g;
이것은 sed 중독자에게 충격을 주지 않기 위해 RHS 대체품으로 지정되었지만 들어가는 것은 더러운 습관입니다. PerlThink에서 "s///"의 오른쪽은 큰따옴표로 묶인 문자열이기 때문입니다. 일반적으로 큰따옴표로 묶인 문자열의 "\1"은 컨트롤-A를 의미합니다. "\1"의 관례적인 Unix 의미는 "s///"에 포함되어 있습니다. 그러나 습관적으로 그렇게 하는 경우 "/e" 수식자를 추가하면 문제가 발생합니다.