SED或AWK命令仅打印两个设置模式之间的行

时间:2013-03-22 22:31:20

标签: shell awk sed ksh hp-ux

我需要一个命令/脚本来获取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 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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