6

数行を連結し、正規表現の一致を実行して印刷したいと思います。私はsedでそれをやろうとしました。

つまり、私は使用しました:

cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'

SOME_REGEX に一致する行のみを出力しますが、FIRST_LINE と LAST_LINE の間の範囲の行を連結し、SOME_REGEX に一致する場合は連結を出力することを期待しています。

4

2 に答える 2

9

'/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/'各行を使用しても個別に処理される場合、行を連結するには、ホールド スペースまたはN次の行をパターン スペースに追加するコマンドを使用する必要があります。1 つのオプションを次に示します。

cat add | sed -rn '/FIRST_LINE_REGEX/{:a;N;/LAST_LINE_REGEX/{/SOME_REGEX/p;d};ba}'

コメント付きバージョン:

cat add | sed -rn '/FIRST_LINE_REGEX/ {  # if line matches /FIRST_LINE_REGEX/
  :a                                       # create label a
  N                                        # read next line into pattern space
  /LAST_LINE_REGEX/ {                      # if line matches /LAST_LINE_REGEX/
    /SOME_REGEX/p                            # print if line matches /SOME_REGEX/
    d                                        # return to start
  }
  ba                                       # return to label a
}'
于 2013-08-04T18:14:19.867 に答える
0

sed -n '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/p' add | sed -n '/FIRST_LINE_REGEX/ b check; H; $ b check; b; :check; x; /SOME_REGEX/p'

2 番目のパイプ部分の動機はここから来ています: https://stackoverflow.com/a/6287105/992834

編集:SOME_REGEXが間にある場合に修正されました。

于 2013-08-04T18:20:27.643 に答える