![최신 편집기 정규식을 구문으로 변환하는 방법은 무엇입니까 sed?](https://linux55.com/image/14249/%EC%B5%9C%EC%8B%A0%20%ED%8E%B8%EC%A7%91%EA%B8%B0%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EA%B5%AC%EB%AC%B8%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%20sed%3F.png)
최신 편집기 정규식을 구문으로 변환하는 방법은 무엇입니까 sed
?
숙련된 개발자이지만 완전 sed
초보자입니다. 찾아주셔서 감사합니다.
- 팝 OS 리눅스 20.04 LTS 사용
- VS Code에서는 정규식을 입력하는 동안 실시간으로 패턴과 일치하기 때문에 정규식을 "요리"하는데, 이는 매우 편리합니다!
- 내 Dockerfile에서 XML을 편집하려고 합니다
sed
. - VS Code에 패턴 일치가 있지만 올바른
sed
명령 구문을 찾을 수 없는 것 같습니다. - 내 정규 표현식을 3가지 다른 방법으로 다시 작성했는데 제거 프로세스가 작동하지 않습니다. 여기서 누락된 개념/구문을 찾을 수 없습니다.
XML 이전
<!-- HTTP Connector from upstream proxy -->
<Connector executor="tomcatConnectorThreadPool" port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="3000" enableLookups="false" redirectPort="443" URIEncoding="UTF-8" bindOnInit="false"
scheme="http" proxyPort="80" />
XML 이후(내가 추구하는 것)
<!-- HTTP Connector from upstream proxy -->Hello World
내 정규식은 VS Code에서 작동합니다.
검색 모드
(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)
교체 패턴
VS 코드 역참조 =$1
$1Hello World
sed
실패하다
왜 이것이 작동하지 않는지 추측해보세요.
특수 문자를 해석할 수 없는 약간 털이 많은 정규식인가요?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
Zizi 언급은 불법인가요?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
왜 이것이 작동하지 않는지 잘 모르시겠습니까?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->)\n(^.*)\n(^.*)\n(^.*)/\1Hello World/g' path/to/xml.xml
이러한 정규식을 올바른 sed
명령 구문으로 표현하려면 어떻게 해야 합니까?
답변1
문제는 여러 개행 문자를 일치시키려는 것 같습니다. 정규 표현식:
(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)
이것은 내가 아는 정규식 스타일에서는 작동하지 않습니다. VSCode 도구는 여러 ^
암시가 "개행 전체 일치"를 의미하는 정규식 스타일을 사용하는 것 같습니다. 대부분의 *nix 유틸리티는 \n
후행 문자로 정의된 "레코드"(줄)를 처리합니다. 여러 줄에 걸쳐 일치시키려면 몇 가지 트릭이 필요합니다.
Linux를 사용하고 있으므로 GNU가 있으므로 sed
다음을 수행할 수 있습니다.
$ sed -Ez 's/^(<!-- HTTP Connector from upstream proxy -->)\n([^\n]*\n){3}/\1Hello World\n/' file.xml
<!-- HTTP Connector from upstream proxy -->Hello World
또는 귀하의 경우 더 짧습니다.
$ sed -Ez 's/^(<!--[^\n]*)\n([^\n]*\n){3}/\1Hello World\n/' file.xml
<!-- HTTP Connector from upstream proxy -->Hello World
여기서의 비결은 전체 파일을 읽고 이를 하나의 "레코드"로 처리한다는 -z
것 입니다. 그런 다음 레코드의 시작 부분에서 a를 찾아 캡처하고 (그룹을 캡처하려면 괄호가 필요함) 개행 문자( )가 나타날 때까지 개행이 아닌 가장 긴 문자를 일치시킨 다음 세 줄을 더 일치시키도록 sed
지시합니다 ( line은 개행 문자가 아닌 뒤에 개행 문자가 오는 것을 의미합니다: ).<!--
\1
[^\n]*\n
([^\n]*\n){3}
이 작업에서는 정규식을 전혀 사용하지 않고 줄 번호만 사용합니다.
$ sed '1s/$/Hello world!/; 2d;3d;4d' file.xml
<!-- HTTP Connector from upstream proxy -->Hello world!