正则表达式:在多行上使用 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
我想在 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