4

ファイルを分割しようとしています。sedたとえば、これを行うために使用できます

sed -e '0,/expr/d' filename

「expr」の後にファイルの下半分が表示されますが、複数のオカレンスがあり、n 回目のオカレンスの後に分割したい場合はどうすればよいでしょうか。2回目の発生後にそれが必要かどうかを判断しました

sed -e '0,/expr/! {/expr/,$d}' filename

"expr" の 2 番目の一致までのファイルの上半分を提供します。感嘆符 (!) は、最初の範囲を無視し、中かっこ内のコマンドのみをファイルの他の部分に適用するように指示します。

しかし、より一般的な場合はどうでしょうか。たとえば、最後から 2 番目の発生から。

ここで使用してきましたが、エレガントなソリューションもあるsedと思います。awk

4

3 に答える 3

2

シンプルな awk ソリューション:

  1. $nth マッチまで/regex/:

    awk -vn=$n '{print}/regex/&&!--n{exit}'

  2. $n番目の一致までは含まない:

    awk -vn=$n '/regex/&&!--n{exit}{print}'

    上記の両方のプログラムケースで、n を 0 に設定すると、ファイル全体が印刷されます。また、デフォルトのアクションは であるため、 の両方の使用を{print}に変更できます。(または、2 番目のプログラムでのみ。)1;{print}1

    完全を期すために:

  3. 試合後のすべて$n

    awk -vn=$n 'n<=0;/regex/{--n}'

注: @mklement0 のコメントで指摘されているように、BSD Awk のバージョン (別名「one-true-awk」) ではコマンドライン オプションの解析にバグがあります。 Kernighan) 2010 年 5 月 23 日より前。これには、Mac OS X で配布されたバージョン (v10.9 以降) が含まれているようです。その結果、これらの awk バージョンのいずれかを使用する場合は、-v n=$n代わりに-vn=$n.

于 2013-11-06T02:43:23.923 に答える
2

@riciのソリューションawkに加えて、さらにいくつかのバリエーション

  1. $nth 番目の一致まで:

    awk -v n=$n 'p<n; /regex/{p++}' file

  2. $n番目の一致までは含まない:

    awk -v n=$n '/regex/{p++} p<n' file

  3. $n番目の試合以降

    awk -v n=$n '/regex/{p++} p>=n' file

  4. $n番目の試合以降

    awk -v n=$n 'p>=n; /regex/{p++}' file


しかし、より一般的な場合はどうでしょうか。たとえば、最後から 2 番目の発生から。

その場合の簡単な方法は、 でファイルを逆方向​​に読み取りtac、上記のオプションを実行して逆方向に再度出力することです。

  1. $n最後の試合以降

    tac file | awk -v n=$n 'p<n; /regex/{p++}' | tac

  2. $n最後の試合から、それを含まない

    tac file | awk -v n=$n '/regex/{p++} p<n' | tac

  3. $n最後のマッチまで

    tac file | awk -v n=$n '/regex/{p++} p>=n' | tac

  4. $n最後の一致まで (これを含まない)

    tac file | awk -v n=$n 'p>=n; /regex/{p++}' | tac


コメントで@mklement0が指摘したOS Xユーザーへの注意

  • 貧弱な [在庫] OS X ユーザー (OS X 10.9 以降) は運が悪い: ありませんtac

  • OS X では使用できます( Linux では をサポートしていないように見えることにtail -r注意してください)。tail-r

于 2013-11-06T04:12:54.243 に答える
0

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

sed -nr 'x;/^X{2}/{x;p;b};x;/REGEXP/{x;s/^/X/;x}' file

これにより、 の 2 番目の一致以降はすべて出力されREGEXPます。

注: REGEXP1 行に 1 回以上発生する場合がありますが、カウントされるのは 1 回だけです。

于 2013-11-06T09:15:54.220 に答える