Grep:以string1开头,以string2的第一次出现结束

时间:2014-03-22 23:55:28

标签: bash grep

我正在尝试解析包含多个http链接的HTML文件。 我希望得到一个以特定字符串开头的BIG行,并以另一个特定字符串结尾,但我不知道这两个字符串之间是什么,所以这是我的问题:如果我像这样使用grep:

grep -E -o 'string1.+string2'

我得到了一个与正则表达式相对应的大行,但由于'。+',它最终会出现'string2'的最后一次。 实际上,我希望它在第一次出现'string2'时结束,所以我尝试了:

grep -E -o 'string1[^(string2)]+string2'

但它也不起作用,我得到了相同的结果:( ...

如何告诉grep匹配以'string1'开头并在'string2'第一次出现时结束的行?

感谢您阅读我

2 个答案:

答案 0 :(得分:1)

+运营商正在"贪婪"任何吃掉所有角色的人(包括string2)。您可以通过添加?使其变得不贪婪(只有在启用perl匹配时才支持此功能,因此-P标志):

grep -P -o 'string1.+?string2

答案 1 :(得分:0)

有些过于复杂awk s

cat file
this is a test string1 get this data string2 but not this string2 end here

awk -F"string" '{split($3,a," ");print FS $2 FS a[1]}' file
string1 get this data string2

awk '{for (i=1;i<=NF;i++) {if ($i=="string1") f=1;if (f) printf $i FS; if ($i=="string2") f=0}print ""}' file
string1 get this data string2

看到更简单的版本会很高兴:)