打印所有匹配的行和上一个未缩进的行

打印所有匹配的行和上一个未缩进的行

例如,假设我想查找文本中所有带有“匹配”的行以及之前未缩进的行。

Container 1
   some text
   some text
   matching text
   some text
Container 2
   some text
   some text
Container 3
   some text
   matching text

我想要的结果看起来像这样

Container 1
   matching text
Container 3
   matching text

这可能吗?

答案1

这是一种方法sed

sed -n '/^[^[:blank:]]/b do      # if line is not indented go to label do
//!{                             # if line is indented and if it
/matching/H                      # matches, append it to hold space
}
$b do                            # if on last line go to label do
b                                # branch to end of script
: do                             # label do
x                                # exchange hold buffer w. pattern space
/\n.*matching/p                  # if current pattern space matches, print
' infile

如果您还想打印匹配的非缩进行,例如Container matching stuff,即使后面的缩进块中没有任何行匹配,那么只需将最后一个条件更改为/matching/p即可删除\n.*限制并打印模式空间,即使它保持只有一行(非缩进)匹配:

sed -n '/^[^[:blank:]]/b do
//!{
/matching/H
}
$b do
b
: do
x
/matching/p
' infile

答案2

awk '
    !/^[[:blank:]]/ {unindented = $0} 
    /matching/ && /^[[:blank:]]/ {print unindented; print}
' file

这会记住最后一行不以空格开头的行。当到达匹配行时,使用该值。

答案3

这是另一个sed

sed -ne'/^[[:space:]]/H;$x;//!{$!x;//!s/\n.*match/&/p;}' <in >out

Container 1
   some text
   some text
   matching text
   some text
Container 3
   some text
   matching text

它认为一个容器是一个连续的非空白行,以非空格字符开头,并且只打印集装箱哪个匹配匹配从第二行开始一次或多次。

您可以将其写出grep

sed ... | grep -E '^([^ ]| .*match)'

...得到像你的例子这样的结果...

相关内容