"/M" 여러 줄 주소 접미사의 간단하고 중요한 사용법은 무엇입니까?

"/M" 여러 줄 주소 접미사의 간단하고 중요한 사용법은 무엇입니까?

GNU sedv4.2.2-7 의 경우 info sed이는 다음을 의미합니다.

'/REGEXP/M'
'\%REGEXP%M'
     The 'M' modifier to regular-expression matching is a GNU 'sed'
     extension which directs GNU 'sed' to match the regular expression
     in 'multi-line' mode.  The modifier causes '^' and '$' to match
     respectively (in addition to the normal behavior) the empty string
     after a newline, and the empty string before a newline.  There are
     special character sequences ('\`' and '\'') which always match the
     beginning or the end of the buffer.  In addition, the period
     character does not match a new-line character in multi-line mode.

예제가 제공되지 않습니다. 테스트 후에는 /M이 접미사가 실제로 무엇인지 명확하지 않습니다.하다. 그것은 다음과 같이 행동하는 것 같습니다아니요 /M별말씀을요.

그러면 간단하고 중요한 사용법은 무엇입니까 /M? 여기서 "가장 단순하다"는 것은 Hello World가 단순하고 다른 프로그램에 대한 추가 지식이 많이 필요하지 않다는 것을 의미하고, "중요하다"는 "/M" 없이는 할 수 없는 주목할만한 일을 해야 한다는 것을 의미합니다.

예를 들어 다음과 같은 경우입니다.

seq 10 | sed -n '<code>;/<some regexp>/Mp'

...다음과 다르게 동작합니다.

seq 10 | sed -n '<code>;/<some regexp>/p'

답변1

이는 perl regex 또는 PCRE에서 사용되는 regex 연산자 의 s 플래그와 동일합니다 m. (s 플래그는 perl 플래그도 제거하지만 , 의 일치 개행 문자가 없기 때문에 , 일치하는 플래그가 필요합니다. 새로운 팀).perl(?m)gsedMsMsed.perls.

-z이러한 플래그는 ,(NUL로 구분된 레코드 읽기)를 사용하거나 G또는 N명령을 사용하여 패턴 공간에 라인을 추가하는 경우와 같이 패턴 공간에 두 개 이상의 라인이 포함된 경우에만 작동합니다 s.

$ seq 3 | sed 'N;s/$/<foo>/g'
1
2<foo>
3
$ seq 3 | sed 'N;s/$/<foo>/Mg'
1<foo>
2<foo>
3

그 이후에는 N패턴 공간에 가 포함됩니다 1<newline>2. 그렇지 않은 경우에는 M패턴 $공간의 끝 부분만 포함됩니다.2) 및 M, $패턴 공간의 첫 번째 줄 끝에 있는 두 개를 일치시킵니다.1, 개행 문자 앞),그리고패턴 공간의 끝에서 (이후2).

답변2

Stéphane이 지적했듯이 이 수정자는 패턴 공간에 둘 이상의 라인이 포함되어 있을 때 유용합니다. 다음은 'H;1h;$!d;x이를 사용하여 유지 버퍼의 모든 라인을 축적한 다음 전체 입력이 패턴 공간에 있도록 마지막 라인의 버퍼를 교환하는 데 사용하는 몇 가지 예입니다 . 따라서 이 입력을 사용하면 다음과 같습니다.

printf %s\\n 'onetwo' 'four' 'fivetwo' | sed 'H;1h;$!d;x;l;d'

패턴 공간은 다음과 같습니다.

onetwo\nfour\nfivetwo$

M유용할 수도 있음

  • 시작 또는 끝을 일치시켜야 하는 경우패턴 공간의 일부 또는 전체 라인:

    printf %s\\n 'onetwo' 'four' 'fivetwo' | sed 'H;1h;$!d;x;s/^/DO/M2;s/$/END/Mg'
    
    onetwoEND
    DOfourEND
    fivetwoEND
    
  • 여러 줄에 걸쳐 있지 않은 일치 항목을 찾으려는 경우:

    printf %s\\n 'onetwo' 'four' 'fivetwo' | sed 'H;1h;$!d;x;s/one.*two/MATCH/M'
    
    MATCH
    four
    fivetwo
    
  • 패턴 공간의 일부 라인이 특정 패턴으로 시작하거나 끝나는 경우 패턴 공간을 조작하려는 경우(이는 s:deletepatternspaceifoneendsof와 작동하지 않는 예 입니다 ur):

    printf %s\\n 'onetwo' 'four' 'fivetwo' | sed 'H;1h;$!d;x;/ur$/Md'
    

이러한 모든 예에서 제거되면 M결과는 완전히 달라집니다. 그러나 이것이 없이 위의 작업을 수행할 수 없다는 의미는 아니며 M단지 더 편리할 뿐입니다.

s/one.*two/MATCH/M'

그리고

s/one[^\n]*two/MATCH/'

또는

/ur$/Md'

그리고

/ur$\|ur\n/d'

관련 정보