繁体   English   中英

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

[英]SED or AWK command to print only lines that are between two set patterns

我需要一个命令/脚本来获取CVS合并冲突。 基本上,我需要一个SED或AWK命令来仅打印两个设置模式之间的行

例:

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

当我尝试一个简单的SED命令,例如:

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

我没有得到预期的输出。 我只想捕获“文件名2和文件名3”的详细信息(合并时发生冲突)。

有人可以帮忙吗?

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

您的sed命令只要看到“ RCS文件”就开始输出,而当看到“冲突”标记时就停止输出。 因此,它几乎可以输出所有内容。 可以使用sed做您想做的事,但这很复杂。 Awk要简单得多:

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

使用awk的记录概念,并用空行将它们分开,并实质上grep每个记录。 因此,这不会在两个模式之间打印线,而是会打印与特定模式匹配的每一行线。

这里您有一个提示:

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

兄弟

使用egrep .....它很简单,无需担心SED和AWK。 它是您在这里想要的固定线模式....

 egrep +B4 conflict INPUT.txt   

在这里B选项打印匹配之前的4行以及与模式匹配的行(im使用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

干得好:

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

对于与“ RCS文件:”不匹配的每一行-将其附加以保留空格。 如果与行(或文件的末尾)匹配,则将模式空间与保留空间交换,并检查其是否与“限制”相匹配。 打印(如果有)。

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

像这样:

sed -n '$ba; /RCS file:/ba; H; d; :a; x; /conflict/p' input.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM