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

Two*_*-Tu 6 regex unix shell sed extract

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

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

VAR="Unrelevant
Unrelevant
Title1
Relevant
Relevant
Title2
Unrelevant"
Run Code Online (Sandbox Code Playgroud)

现在我想提取“Title1”和“Title2”之间的部分(包括“Title1”)并将内容保存到名为“RELEVANT”的变量中。在该变量上使用echo应该给我这个所需的输出:

Title1
Relevant
Relevant
Run Code Online (Sandbox Code Playgroud)

我的尝试是:

RELEVANT=(echo "$VAR" | sed -e 's/.*Title1\(.*\)Title2.*/\1/g'))
Run Code Online (Sandbox Code Playgroud)

但这仅在 VAR 是一句俏皮话时才部分起作用:

VAR="Unrelevant Unrelevant Title1 Relevant Relevant Title2 Unrelevant"
Run Code Online (Sandbox Code Playgroud)

“部分”,因为输出是:

 Relevant Relevant
Run Code Online (Sandbox Code Playgroud)

...第一个“Relevant”之前有一个空格,该空格不应该存在并且没有前面的“Title1”。

好吧,除此之外,如果 VAR 跨越多条线,我就无法正常工作。所以我的问题是:如何让它适用于拉伸多行的字符串?

anu*_*ava 4

这是一个sed解决方案:

echo "$var" | sed -n '/^Title1$/,/^Title2$/p' | sed '$d'
Run Code Online (Sandbox Code Playgroud)

Title1
Relevant
Relevant
Run Code Online (Sandbox Code Playgroud)
  • -n抑制正常输出
  • 第一个sed命令匹配两个模式之间的文本并使用p命令打印它们
  • 第二个sed命令只是跳过最后一行,这给了我们所需的输出。

或者使用一个sed

echo "$var" | sed -n '/^Title1$/,/^Title2$/{/^Title2$/!p;}'
Title1
Relevant
Relevant
Run Code Online (Sandbox Code Playgroud)

  • 我想这就是我一直在寻找的!不过,您能给我第一个解决方案的详细说明吗?我只能理解其中的一部分,但不能理解其全部。再次谢谢你! (2认同)