0

sed2 番目のパターンがファイル内の最後の出現を検索するようにパターン範囲マッチングを設定する簡単な方法はありますか?

sed -r '1,/\[notice\]/d' /var/log/apache2/error.log

[notice]最初のパターンが見つかった後、すべての行を吐き出します。でもそれが最後の[notice]パターンになるように作ればよかった。

4

3 に答える 3

2

sed は、1 行で単純な置換を行うための優れたツールです。その他のテキスト操作には、awk を使用するだけです。

$ cat file
line 1
[notice]
line 2
[notice]
line 3

$ awk 'NR==FNR{if (/\[notice\]/) tgt=NR; next} FNR>tgt' file file
line 3

上記は、ファイルの 2 つのパスを使用します。最初のパスはパターンの最後の出現の行番号を検索し、2 番目のパスは必要な行を出力します。

別の方法は、ファイル全体を単一のレコードとして読み取り、最後の [通知] (および周囲のスペース/改行) までのすべてを削除することです。たとえば、GNU awk を使用します。

$ gawk -v RS='\0' -v ORS= '{sub(/.*\[notice\]\s*/,"")}1' file
line 3
于 2013-05-07T18:20:12.990 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/\[notice\]/{h;d};x;/./!{x;d};x;H;$!d;x;s/[^\n]*\n//' file

柄とその後の線はホールドスペースに収納してください。ファイルの最後で、これらの行を出力します (パターンの以前の繰り返しは最後の行で上書きされます)。

別の方法は、ファイル全体をメモリに丸呑みしてから、不要な部分を削除することです (貪欲はあなたの友人です:):

sed ':a;$!{N;ba};s/.*\[notice\][^\n]*\n//' file
于 2013-05-08T04:49:29.983 に答える
0

ファイルを 1 回読み取ります。大きなファイルには適していない可能性があります

awk '{a[NR]=$0; /notice/ && b=NR} END {for(c=b+1;c<=NR;c++) print a[c]}'
于 2013-05-07T19:58:09.337 に答える