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

时间:2018-06-17 13:51:38

标签: regex shell unix sed extract

我想在UNIX中使用 sed 在两个字符串之间提取内容。我知道 sed 只适用于一行但在我的情况下,我想提取多行的内容。

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

x.ClosePrice

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

proccessing_data['Max'] = proccessing_data.groupby('Symbol').ClosePrice.transform('max')
#                       specify the column to transform here ^^^^^^^^^^

proccessing_data['RSI'] = proccessing_data.groupby('Symbol').ClosePrice.transform(lambda x: talib.RSI(x, timeperiod=14))
#                       specify the column to transform here ^^^^^^^^^^

我的尝试是:

VAR="Unrelevant
Unrelevant
Title1
Relevant
Relevant
Title2
Unrelevant"

但这只是在VAR是一个单行时才有效:

Title1
Relevant
Relevant

"部分",因为输出是:

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

...在第一个"相关"之前有一个空格,它不应该在那里,没有前面的" Title1"。

嗯,除此之外,如果VAR超过多行,我无法正常工作。所以我的问题是:我如何使用一个拉伸多行的字符串?

1 个答案:

答案 0 :(得分:2)

以下是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