例如,假设我想查找文本中所有带有“匹配”的行以及之前未缩进的行。
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)'
...得到像你的例子这样的结果...