0

htm ファイル内の 3 行の複数行パターンの出現をカウントする必要があります。問題は、行 1 と 3に修正内容があることですが、行 2の内容は修正されておらず、変更される可能性があります (ファイルはログです)。これが私が意味することの例です:

fix line 1
changing line 2
fix line 3

解決策を検索しましたが、100% 適切な解決策が見つかりませんでした...pcregrepうまくいくはずですが、行 2 の変更を含めるにはどうすればよいですか? これまでのところ、2 つの修正行しか探すことができません。ここではコード自体が問題ですが、出力は非常に使いやすいです。

pcregrep -Mc '^line1\n^line2\n^line3' file

または、sed代わりに使用する必要がありますか?コードは機能しますが、出力複雑です。この複数行パターンの出現回数をカウントするにはどうすればよいですか? 1 行目と 3 行目の間には 1 行しかないため、これは重要です。

sed -n '/^line1/,/^line3/=' file

あなたが私を助けてくれることを願っています。どうもありがとうございました!

4

3 に答える 3

1

以下のpcregrepコマンドを使用できます。

pcregrep -Mc '^line 1\n[^\n]*\nline 3' file

例:

$ cat file
line 1
changing line 2
line 3
foo
bar
buz
line 1
changing line
line 3
foo
bar
buz
line 1
bar
line 3
$ pcregrep -Mc '^line 1\n[^\n]*\nline 3' file
3
于 2015-02-14T15:51:29.037 に答える
0

pcregrep私が使用しているUNIXボックスにはありませんが、すべてのUNIXインストールで使用できるため、awkを使用できます。たとえば、@AvinashRajのサンプル入力ファイルに対して実行し、複数文字RSにGNU awkを使用します。

$ awk -v RS='^$' '{print gsub(/(^|\n)line 1\n[^\n]*\nline 3\n/,"")}' file
3

または任意の awk で:

$ awk '{rec=rec $0 RS} END{print gsub(/(^|\n)line 1\n[^\n]*\nline 3\n/,"",rec)}' file
3

RE の前後にアンカーを追加して、誤った一致が生成されないようにしました。

于 2015-02-14T16:58:42.900 に答える
0

これはあなたのために働くかもしれません(GNU sed & wc):

sed '1N;N;/fix line 1\n.*\nfix line 3/{x;s/^/\n/;x};$!D;x;s/.//p;d' file | wc -l

これにより、ファイル全体に 3 行の移動ウィンドウが作成され、目的のパターンに遭遇するとホールド スペースに改行が追加されます。ファイルの最後で、wc を使用して改行がカウントされます (sed が追加する追加された改行を差し引いたもの)。

このソリューションは、ファイル全体の 3 行のすべてのグループを具体的に調べるため、インターリーブ パターンにも対応します。

于 2015-02-16T18:23:18.307 に答える