"/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で区切られたレコードを読み取る)を使用したり、コマンドを使用してパターンスペースに行を追加したりするなど、パターンスペースに複数の行が含まGNている場合にのみ機能します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$パターンスペースの最初の行の末尾にある2つを一致させます。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'

関連情報