首页 > 解决方案 > 如何在 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'没有运气。

标签: bashparsingawksedgrep

解决方案


使用 GNU sed:

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

或简化:

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

输出:

模式1
    abcde
    福吉
模式1
模式1
    克洛姆诺
模式1
模式1
    pqrst

推荐阅读