그래서 test.txt 파일이 있습니다.
home -> range
vim에서 파일을 편집하고 명령을 실행 %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
하면 파일이 다음으로 변환됩니다.
range ::= home ;
내가 원하는 것입니다. 그러나 내가 달리면
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
내가 똑같이해야한다고 생각하지만 아무런 변화가 없습니다. 누군가가 잘못되었는지 말해 줄 수 있습니까? 나는 탈출해야 할 것으로 생각되지만 탈출의 모든 조합을 던졌습니다 … 두 형식 간의 변환에 대한 일반적인 규칙을 원합니다 …
답변
Perl에서는 캡처 괄호를 피하지 말고 캡처 변수에 \ 1, \ 2 대신 $ 1, $ 2를 사용하는 것이 일반적입니다.
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
삶의 불행한 사실이다 정규 표현식에 많은 일반적인 도구 (정력, 나오지도, AWK, 펄)에 사용 (RE)의 모든 미묘하게 다르다. 일부 도구에는 Perl RE, POSIX 기본 RE (BRE) 또는 POSIX 확장 RE (ERE)를 사용하는 옵션이 있습니다.
perldoc perlre
이것에 대답하는 $1
VS \1
교체 식의 여분의 일부
어떤 사람들은 다음과 같은 글을 쓰는 데 너무 익숙합니다.
$pattern =~ s/(\W)/\\\1/g;
이것은 sed 중독자를 충격을 피하기 위해 RHS를 대체하기 위해 RHS의 할아버지이지만, 들어가는 것은 더러운 습관입니다. PerlThink에서 “s ///”의 오른쪽이 큰 따옴표로 묶인 문자열이기 때문입니다. 일반적인 큰 따옴표로 묶인 문자열에서 “\ 1″은 control-A를 의미합니다. “\ 1″의 관례적인 유닉스 의미는 “s ///”에 대해 잘 알려져 있습니다. 그러나 그렇게하는 습관을들이는 경우 “/ e”수정자를 추가하면 문제가 생길 수 있습니다.