模式匹配并在下一行中找到另一种模式

时间:2014-08-06 06:35:03

标签: string bash shell append pattern-matching

在文件中找到一个string1并检查它的下一行是否为string2,如果没有找到,则在string1行之后附加一些文本。

例如,以下是输入文件

blah
blah
blah
string1
text string2
blah
blah
string1
blah
blah
blah
string1
text string2
blah
blah
blah
string1
text string2
blah
blah

如果在string1的下一行中找不到string2,我需要在10行“ - - - - - - - - - - - - - - - - - - - - ”后附加此文件。输出文件应如下所示。

blah
blah
blah
string1
text string2
blah
blah
string1
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
blah
blah
blah
string1
text string2
blah
blah
blah
string1
text string2
blah
blah

帮助我在不使用循环的情况下在shell中编写代码。感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用Awk。

awk -v s="string1" -v t="string2" '\
$0 ~ s {
    print
    getline
    if($0 !~ t) {
        for(i=1;i<=10;i++) {
            for(j=1;j<=32;j++) 
                printf "-"
            printf "\n"
        }
    }
}1' file

说明

为Awk设置两个字符串变量。

-v s="string1" -v t="string2"

如果string1(变量s)在线上,则会执行左括号内的所有内容。

$0只是Awk扩展到整个生产线的方式。

$0 ~ s {

一旦满足条件,我们就会打印该行,然后转到下一行进行getline处理。

接下来,如果string2(变量t)不在该行中,我们会使用-执行一些循环来打印10行32 printf个字符。< / p>

    print
    getline
    if($0 !~ t) {
        for(i=1;i<=10;i++) {
            for(j=1;j<=32;j++) 
                printf "-"
            printf "\n"
        }
    }

1只是用于打印的awk简写。我在最外面的条件之外使用它来打印其他所有东西。

}1' file

以下内容会做同样的事情。

}{print}' file

答案 1 :(得分:1)

对于查找模式,我可以告诉你表达式,为了替换行(追加10行),你必须使用sed。 你可以在谷歌上或通过一些实验得到它。

我没有向你提供所有的东西,因为这里没有预料到的。

[db2admin@giam20 ~]$  pcregrep -n -v -M 'string1.*\n.*string2' file1.txt | grep string1
8:string1

上面是正则表达式,它将为您提供该行的行号,该行在下一行中不包含string2。现在提供这个作为sed的输入来完成你的工作。

仅获取行号。使用cut as,

[db2admin@giam20 ~]$  pcregrep -n -v -M 'string1.*\n.*string2' file1.txt | grep string1  |cut -f 1 -d ":"
8

希望这有帮助。