1

pom.xml に変更が加えられた Subversion ダンプ内のすべてのリビジョンを見つける必要があります。

私はsvndumptoolを使用してリビジョンを正常に出力し、sed を使用してそれらの調査結果をフィルタリングしています。

リビジョン番号を開始として一致させることはできますが、停止を見つける前に2番目の一致する開始を見つけた場合、これを破棄できる必要があります。

これが私が使用しているコマンドです:

    svnDumpTool=~/path/to/svndumptool.py
    target=specificSvn.dump

    # use svndumptool to read the svnlog from target to stdin | 
    # sed then matches start -r[0-9], such as -r103, ends on pom.xml
    # then redirects stdout > to a log file for this target

    $svnDumpTool log $target -v | sed -n '/r[0-9]/,/pom.xml/p' > $target.log

次のようなログを検討します。

    -r0 | ... | ...
    Changed paths:
    none; initialization of the repo; not my match
    -r1 | ... | ...
    Changed paths:
    ... not my matches here
    --------
    -r2 | ... | ...
    Changed paths:
    ... nor here
    --------
    -r3 | ... | ...
    Changed paths:
    pom.xml
    --------
    -r4 | ... | ...
    Changed paths:
    pom.xml
    --------
    -r5 | ... | ...
    Changed paths:
    ... changes may or may not be here
    --------

これが結果です。

  1. 最初のパスでは、必要以上のものを取得します。

    • -r0 の開始時に一致します。
    • -r3 からの pom.xml の末尾の一致、
    • -r0、-r1、-r2を含む、最初から最後まですべてを出力します。

      -r0 | ... | ...
      Changed paths:
      none; initialization of the repo; not my match
      -r1 | ... | ...
      Changed paths:
      ... not my matches here
      --------
      -r2 | ... | ...
      Changed paths:
      ... nor here
      --------
      -r3 | ... | ...
      Changed paths:
      pom.xml
      
  2. 2回目のパスで、私が望むものを正確に取得します:

    • -r4 の開始時に一致します。
    • -r4 からの pom.xml の末尾の一致:

      -r4 | ... | ...
      Changed paths:
      pom.xml
      

だから、私がする必要があると思うのは:

  1. きっかけを見つけたら、
  2. そして、末尾に一致する式を見つける前に、開始に一致する別の式を見つけます。
  3. 次に、最初のスタートを捨てます。それ以外の場合は印刷します。

この投稿に答えがあると思いますが、私が試した試みはすべて失敗しました。

編集:自動修正でわかりました。出力を「pom.xml」にする必要があるのに、誤って「Pom.xml」としてリストしました。

4

3 に答える 3

1

ここでは Sed は間違ったツールです。あなたはそれを行うことができます(sedはチューリング完全です)が、読むことができなくなります。

awk の方がはるかにうまく機能する可能性があります。私はよく知らないsvndumptool; リビジョン間にセパレーターを配置すると仮定すると、それを--------レコードセパレーターとして使用できます。GNU awk では、正規表現をレコード セパレータとして使用できます。

awk -v RS='--------\n' -v ORS='--------\n' '
  /^pom\.xml$/ { print }
'
于 2013-08-20T00:32:41.990 に答える
1

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

sed '/-r[0-9]/{h;d};H;/Pom.xml/!d;x' file

これは、最初の行-r[0-9]とそれ以降の行をホールド スペースに格納し、HS に既にある行を新しい行で上書きし、そのPom.xmlような行をすべて出力するときを含む行にします。

于 2013-08-20T06:43:59.527 に答える
1

私はこの種のものに

#!/usr/bin/env perl

use strict;
use warnings;

my $svnDumpTool = '~/path/to/svndumptool.py';
my $target      = 'specificSvn.dump';

my @rev = split /----*/, `$svnDumpTool log $target -v`;
foreach (@rev) {
  print if m/-r\d+[\s\S]*?Pom\.xml/;
}
于 2013-08-20T00:29:16.567 に答える