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