bash sed / grep提取2个单词之间的文本

时间:2014-01-26 20:42:45

标签: regex linux bash sed

我的问题和它在这里一样,除了我只想要第一次出现,忽略所有其余部分:

How to use sed/grep to extract text between two words?

在他的例子中,如果是:

 input: "Here is a String Here is a String"

但我只关心第一个“是”

echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)' 

输出:“是一个字符串这是一个”

grep可以实现这一点吗?我也可以使用sed来完成这项工作。

由于

3 个答案:

答案 0 :(得分:1)

您的正则表达式恰好与“Here”和“String”之间的最长字符串匹配。确实,“这里是一个字符串这里是字符串”。这是*量词的默认行为。

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a String Here is a

如果你想匹配最短的,你可以在?量词之后加上*(贪婪修饰符):

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*?(?= String)'
is a
is a

答案 1 :(得分:0)

要获得第一个单词,您可以使用grep -o '^[^ ]*'

echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)' | grep -o '^[^ ]*'

你可以多次将grep传递给grep,将简单的命令组合成复杂的命令。

答案 2 :(得分:0)

sed 's/ String.*//;s/.*Here //'