如何匹配以sed或grep为前缀的嵌套文本

时间:2018-09-19 16:51:53

标签: bash parsing awk sed grep

我试图匹配嵌套文本,包括嵌套文本前紧靠sed或grep的行。

我正在使用的示例:

pattern3
    abcde
    fghij
pattern3
pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern3
    abcde
pattern1
    pqrst
patterh3
    fghij

请注意,在嵌套文本的前面总是有四(4)个空格。另外,在匹配模式之后,可能会嵌套嵌套文本,也可能不会嵌套嵌套文本。

我对所有pattern1行,以及pattern1之后的以空格开头的行感兴趣。

我正在寻找的输出是:

pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst

我和以下人有亲密关系

sed -n '/^pattern1/,/^pattern1/p' data.txt

但是似乎在pattern1右侧匹配之后跳过嵌套的文本,然后转到下一个迭代。

我也尝试sed -n '/^\"pattern1\"$/,/^\"pattern1\"$/p' data.txt | sed '1d;$d'也不运气。

4 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed -n '/pattern1/{p;:x;n;s/^    .*/&/;p;tx}' file

或简化:

sed -n '/pattern1/{p;:x;n;p;/^    /bx}' file

输出:

pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst

答案 1 :(得分:1)

请您尝试以下。

awk '/pattern[23]/{flag=""} /pattern1/{flag=1} flag'  Input_file

OR

awk '/pattern[^1]/{flag=""} /pattern1/{flag=1} flag'  Input_file

说明: 也在此处添加说明。

awk '
/pattern[^1]/{        ##Checking condition if a line is having string pattern with apart from digit 1 in it then do following.
  flag=""             ##Nullifying variable flag value here.
}
/pattern1/{           ##Checking condition here if a line is having string pattern1 then do following.
  flag=1              ##Setting value of variable flag as 1 here.
}
flag                  ##Checking condition if value of flag is NOT NULL then print the line value.
' Input_file          ##Mentioning Input_file name here.

答案 2 :(得分:1)

$ awk '/^[^ ]/{f=/^pattern1$/} f' file
pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst

答案 3 :(得分:1)

这可能对您有用(GNU sed):

sed '/^\S/h;G;/pattern1/P;d' file

将当前模式存储在保留空间中,并将其附加到每一行。如果当前图案是pattern1,则打印当前行和/或删除当前行。