최신 편집기 정규식을 구문으로 변환하는 방법은 무엇입니까 sed?

최신 편집기 정규식을 구문으로 변환하는 방법은 무엇입니까 sed?

최신 편집기 정규식을 구문으로 변환하는 방법은 무엇입니까 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실패하다

왜 이것이 작동하지 않는지 추측해보세요.

  1. 특수 문자를 해석할 수 없는 약간 털이 많은 정규식인가요?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
    
  2. Zizi 언급은 불법인가요?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
    
  3. 왜 이것이 작동하지 않는지 잘 모르시겠습니까?

    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!

관련 정보