数行を連結し、正規表現の一致を実行して印刷したいと思います。私はsedでそれをやろうとしました。
つまり、私は使用しました:
cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'
SOME_REGEX に一致する行のみを出力しますが、FIRST_LINE と LAST_LINE の間の範囲の行を連結し、SOME_REGEX に一致する場合は連結を出力することを期待しています。
'/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
}'
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が間にある場合に修正されました。