ed 텍스트 편집기를 사용하여 첫 번째 기호가 다른 RegExp의 첫 번째 단어를 캡처하는 방법

ed 텍스트 편집기를 사용하여 첫 번째 기호가 다른 RegExp의 첫 번째 단어를 캡처하는 방법

쉘 명령이 있습니다.

printf '/^PermitRootLogin/\nc\nPermitRootLogin no\n.\nw\nq\n' | ed -s /etc/ssh/sshd_config

문장에서 이 문구를 사용하여 #PermitRootLogin유사 PermitRootLogin하지만 주석 처리되지 않은 단락을 캡처해야 합니다. 저는 ed 텍스트 편집기를 사용하고 있으며 RegExp를 사용하여 해당 명령의 모든 항목을 캡처하는 방법을 찾으려고 노력하고 있습니다.

이 OS에는 GNU 유틸리티가 없습니다. 답변 주셔서 감사합니다!

답변1

정규식은 쉘 글로브 패턴과 동일하지 않습니다. 이는 줄의 시작 부분과 일치하고 이전 하위 표현식의 0 또는 1(이 경우 )을 나타내기 ^?때문에 정규 표현식으로서 유효한 의미가 없습니다 .^?^

이 시도:

grep `^.?SomeString`

설명하다:

^           anchors the match to the start of the line
.?          means 0 or 1 of any character
SomeString  match "Somestring"

답변2

,, 그리고독립적인 명령이므로 뒤에 텍스트가 와야 합니다.다음 줄에. 따라서 다음 줄을 마무리해야 합니다.. 당신은 이미 그것을 얻었습니다 \. 방금 잊어버린 것 같습니다 n.

printf '/^PermitRootLogin/\nc\NPermitRootLogin 아니요\n. \nw\nq\n' | ed -s /etc/ssh/sshd_config

답변3

  1. 구성 파일에 절대 나타나지 않는 임의의 문자열을 선택하십시오. /, ., *[의 특수문자는 사용하지 않는 것이 좋습니다 ]. 예를 들어 를 사용하겠습니다 <G-Man>.
  2. 다음을 수행하십시오.

    ed -s /etc/ssh/sshd_config << EOF
            g/^#*PermitRootLogin/s/^/<G-Man>/
            g/^<G-Man>##*PermitRootLogin...../s/<G-Man>//
            1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/
            w
            q
    EOF
    
  3. 이것은 무엇을 합니까?

    모든 행을 찾습니다

    • 로 시작 PermitRootLogin하거나
    • 하나 이상의 #문자로 시작하고 그 뒤에 PermitRootLogin최대 4개의 다른 문자가 옵니다.

    로 변경하고 PermitRootLogin no#시작 부분의 문자를 그대로 유지합니다.

  4. 아? 무엇? 왜 이런 일을 하는가?

    목표는 다음 줄 중 하나를 변경하는 것입니다.

    PermitRootLogin yes
    PermitRootLogin no
    PermitRootLogin The quick brown fox jumps over the lazy dog.
    #PermitRootLogin yes
    #PermitRootLogin no
    

    그러나 다음 줄은 아닙니다.

    #In this section we set
    #PermitRootLogin to “maybe”,
    #because we haven’t decided yet.
    

    이 디자인에는 다음과 같은 불행한 부작용이 있을 수 있습니다.

    ##PermitRootLogin yes
    ##PermitRootLogin ???
    

    ~ 할 것이다변경하고 다음 줄을 추가합니다.

            PermitRootLogin yes
    # PermitRootLogin yes
            #PermitRootLogin yes
    

    하지 않을 것이다.

  5. 어떻게 작동하나요?
    • g/^#*PermitRootLogin/s/^/<G-Man>/PermitRootLogin로 시작 하거나 #바로 뒤에 하나 이상의 문자로 시작 하는 모든 줄을 찾아 PermitRootLogin문자열로 "표시"합니다 <G-Man>(줄 시작 부분에 삽입). PermitRootLogin문자 앞이나 뒤에 공백(또는 다른 것)이 없으면 주석 처리된 행에 영향을 미칩니다 .#
    • g/^<G-Man>##*PermitRootLogin...../s/<G-Man>// 라벨이 있는 모든 행 찾기마지막 하나 #시작 부분에 5자 이상의 문자가 오고 PermitRootLogin태그를 제거하세요. PermitRootLogin길이를 초과하는 주석 줄의 표시가 해제됩니다  yes. (물론 수량을 변경할 수 있습니다..당신이 할 의향이 있다면. )
    • 1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/ 여전히 마커가 있는 모든 줄을 찾아 마커를 제거 PermitRootLogin하고 모든 이전 #문자를 캡처하여 유지하고 나머지 줄을  no.
  6. 물론, printf원하는 경우 이러한 명령을 a로 축소할 수 있습니다.

관련 정보