1

CVSマージの競合を取得するには、コマンド/スクリプトが必要です。基本的に、2つの設定されたパターンの間にある行のみを印刷するにはSEDまたはAWKコマンドが必要です

例:

Pattern1="RCS file:"
Pattern2="conflicts during merge"

次のような単純なSEDコマンドを試すと、次のようになります。

sed -n '/RCS file:/,/conflicts during merge /p' INPUT.txt

期待どおりの出力が得られません。「filename2とfilename3」の詳細のみをキャプチャしたい(マージ中に競合が発生した)。

誰か助けてもらえますか?

INPUT.txt

RCS file: /hello/filename1
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename1

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename4
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename4

(Expected) OUTPUT.txt

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge
4

4 に答える 4

1

コマンドは、「 RCSsedファイル」が表示されるたびに出力を開始し、「競合」マーカーが表示されると停止します。したがって、ほとんどすべてを出力します。sed でやり​​たいことはできますが、複雑です。awk ははるかに単純です。

awk -v RS= '/conflicts/ {print $0}' INPUT.txt 

awk のレコードの概念を空白行で区切って使用し、基本的に各レコードを grep します。したがって、これは 2 つのパターン間の行を出力するのではなく、特定のパターンに一致する行の各ブロックを出力します。

于 2013-03-22T23:02:47.937 に答える
0

ここにヒントがあります:

awk '{if ($1=="HO") i=1}; {if ($1=="JOU") i=0}; i{print}' file

例:

$ cat file
HI
HO
JE
JOU
LA

それで、

Pattern1="HO"
Pattern2="JOU"
awk -v p1=${Pattern1} -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file
HO
JE

あなたのケースに基づいて、

Pattern1="RCS file:"
Pattern2="conflicts during merge"

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file

編集

このテキストを含む文字列を検索する場合は、次のように実行できます。

Pattern1="RCS file:"
Pattern2="conflicts during merge"

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1 ~ p1) i=1}; {if ($1 ~ p2) i=0}; i{print}' file
于 2013-03-22T23:02:59.743 に答える
0

ブロ、

egrep を使用してください ..... シンプルで、SED と AWK について心配する必要はありません。ここで必要な行の固定パターン....

 egrep +B4 conflict INPUT.txt   

ここで B オプションは、パターンに一致する行とともに、一致する前の 4 行を出力します (GNU egrep を使用しています)。

egrep 出力:

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge
--
RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge
于 2013-03-26T05:30:31.323 に答える
0

どうぞ:

sed -n '/RCS file:/ !{H;d}; /RCS file:/ {x; /conflict/p}; $ {x; /conflict/p}' input.txt

'RCS file:' に一致しないすべての行について - スペースを確保するために追加します。行に一致する場合 (またはファイルの終わりである場合) - パターン スペースをホールド スペースと交換し、「conflit」と一致するかどうかを確認します。ある場合は印刷します。

分岐を使用すると、より簡単になる可能性があります。

このような:

sed -n '$ba; /RCS file:/ba; H; d; :a; x; /conflict/p' input.txt
于 2013-03-26T05:59:34.803 に答える