1

我需要一个命令/脚本来获取 CVS 合并冲突。基本上,我需要一个 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

您的sed命令在看到“RCS 文件”时开始输出,并在看到“冲突”标记时停止。所以它几乎输出了所有东西。用 sed 可以做你想做的事,但它很复杂。awk 要简单得多:

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

使用 awk 的记录概念,用空行分隔它们,并且基本上 grep 每条记录。所以这不会打印两个模式之间的行,而是打印与特定模式匹配的每个行块。

于 2013-03-22T23:02:47.937 回答
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

在这里你有一个提示:

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

干得好:

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

对于与“RCS 文件:”不匹配的每一行 - 将其附加以保留空间。如果它匹配该行(或者是文件的结尾) - 将模式空间与保持空间交换并检查它是否匹配'conflit'。如果有,请打印。

如果我们使用分支可能会更简单。

像这样:

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