Shell SED或AWK命令,仅打印两组图案之间的线条

Shell SED或AWK命令,仅打印两组图案之间的线条,shell,awk,sed,ksh,hp-ux,Shell,Awk,Sed,Ksh,Hp Ux,我需要一个命令/脚本来获取CVS合并冲突。基本上,我需要一个SED或AWK命令来只打印两组模式之间的行 例如: Pattern1="RCS file:" Pattern2="conflicts during merge" $ cat file HI HO JE JOU LA 当我尝试一个简单的SED命令时,如: sed -n '/RCS file:/,/conflicts during merge /p' INPUT.txt 我没有得到预期的输出。我只想捕获“filename2和filen

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

例如:

Pattern1="RCS file:"
Pattern2="conflicts during merge"
$ cat file
HI
HO
JE
JOU
LA
当我尝试一个简单的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

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

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

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

您的
sed
命令在看到“RCS file”时开始输出,在看到“conflicts”标记时停止。所以它几乎输出了所有东西。使用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
例如:

Pattern1="RCS file:"
Pattern2="conflicts during merge"
$ cat file
HI
HO
JE
JOU
LA
所以

根据你的情况,

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
这里有一个提示:

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

Pattern1="RCS file:"
Pattern2="conflicts during merge"
$ cat file
HI
HO
JE
JOU
LA
所以

根据你的情况,

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
兄弟

使用白鹭。。。。。它很简单,不需要担心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
兄弟

使用白鹭。。。。。它很简单,不需要担心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
给你:

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
给你:

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

这正是提交者要求的,但不是他想要的。它会在看到第一个图案时开始打印,但直到消息结束时才知道是否应该打印。是的,现在我看到@eviotto。我已经更新了我的答案,以便考虑到行中包含此文本。这正是提交者要求的,但不是他想要的。它会在看到第一个图案时开始打印,但直到消息结束时才知道是否应该打印。是的,现在我看到@eviotto。我已经更新了我的答案,以便考虑到行中包含此文本。
sed-n'/^$/!{H;$!d};x/合并期间发生冲突$/p'
sed:Function/RCS file:/!{H;d}/RCS文件:/{x;/conflict/p};$无法分析{x;/conflict/p}。@jthill
当我运行SED命令时,我得到以下错误
这可能是hpux版sed的一个限制。您可以尝试将sed脚本写入一个文件(用换行符替换所有分号),然后使用
-f
键运行它,如下所示:
sed-n-f my_script.sed input.txt
我找到了HP-UX sed的手册页,但没有看到分号。所以它要么是一个多行文件,要么是多个
-e
参数。像这样:
sed-n-e'/^$/!{H'-e'$!d'-e'}'-ex-e'/合并期间发生冲突$/p'input.txt
sed-n'/^$/!{H;$!d};x/合并期间发生冲突$/p'
sed:Function/RCS file:/!{H;d}/RCS文件:/{x;/conflict/p};$无法分析{x;/conflict/p}。@jthill
当我运行SED命令时,我得到以下错误
这可能是hpux版sed的一个限制。您可以尝试将sed脚本写入一个文件(用换行符替换所有分号),然后使用
-f
键运行它,如下所示:
sed-n-f my_script.sed input.txt
我找到了HP-UX sed的手册页,但没有看到分号。所以它要么是一个多行文件,要么是多个
-e
参数。像这样:
sed-n-e'/^$/!{H'-e'$!d'-e'}'-ex-e'/合并期间的冲突$/p'input.txt
当我尝试AWk命令时,我得到以下错误
awk:Input line RCS file:/was\u apps/不能超过3000字节。当我尝试awk命令时,出现以下错误
awk:输入行RCS文件:/was\u apps/不能超过3000字节。