GNU sed
v4.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)
gsed
M
s
M
sed
.
perl
s
.
-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'