正则表达式:在多行上使用 sed 提取两个字符串之间的内容

Regex: Extract content between two strings using sed over multiple lines

我想在 UNIX 中使用 sed 提取两个字符串之间的内容。我知道 sed 仅适用于一行,但就我而言,我想提取跨越多行的内容。

为了让您了解情况,这里有一个字符串变量,其中包含我想提取的行和我想忽略的行:

VAR="Unrelevant
Unrelevant
Title1
Relevant
Relevant
Title2
Unrelevant"

现在我想提取 "Title1" 和 "Title2" 之间的部分,包括 "Title1" 并将内容保存到名为 "RELEVANT" 的变量中。在那个变量上使用 echo 应该给我这个期望的输出:

Title1
Relevant
Relevant

我的尝试是:

RELEVANT=(echo "$VAR" | sed -e 's/.*Title1\(.*\)Title2.*//g'))

但这仅在 VAR 为单线时部分起作用:

VAR="Unrelevant Unrelevant Title1 Relevant Relevant Title2 Unrelevant"

"Partly",因为输出是:

 Relevant Relevant

...在第一个 "Relevant" 之前有一个 space,它不应该存在并且没有前面的 "Title1".

好吧,除此之外,如果 VAR 超过多行,我将无法正常工作。所以我的问题是:我如何才能使它适用于延伸多行的字符串?

这是一个sed解决方案:

echo "$var" | sed -n '/^Title1$/,/^Title2$/p' | sed '$d'

Title1
Relevant
Relevant
  • -n 抑制正常输出
  • 第一个 sed 命令匹配 2 个模式之间的文本并使用 p 命令打印它们
  • 第二个 sed 命令只是跳过最后一行,这给了我们想要的输出。

或单个 sed:

echo "$var" | sed -n '/^Title1$/,/^Title2$/{/^Title2$/!p;}'
Title1
Relevant
Relevant