使用egrep -o后如何egrep

时间:2013-02-17 06:13:23

标签: linux bash shell grep

我有一个名为random.html的文件,其中包含以下行(不是唯一一行):

blahblahblahblah random="whatever h45" blahblahblahblah

我想特别得到任何东西,到目前为止我使用了以下内容:

egrep -o 'random="([a-z]*[A-Z]*[0-9]*[ ]*)+'

这给了我random="whatever h45

我不能仅使用egrep -o ="([a-z]*[A-Z]*[0-9]*[ ]*)+'开头,因为这不是我唯一的行,并且会有不需要的行,随机关键字对于区分目的很重要。我试图做一个双重egrep -o,如:

egrep -o 'random="([a-z]*[A-Z]*[0-9]*[ ]*)+' | egrep -o '="([a-z]*[A-Z]*[0-9]*[ ]*)+'

它只显示="whatever h45,但不起作用。我做错了什么或这是非法的?我不想使用任何花哨的东西或使用切割。这应该是非常“基本的”。

4 个答案:

答案 0 :(得分:1)

这与grep无关;看到这个问题(和接受的答案):Capturing Groups From a Grep RegEx

答案 1 :(得分:1)

你只是使用了错误的工具,这在awk中是微不足道的。有各种解决方案,一个是:

$ cat file
blahblahblahblah random="whatever h45" blahblahblahblah

$ awk 'match($0,/random="([a-z]*[A-Z]*[0-9]*[ ]*)+/) { print substr($0,RSTART+8,RLENGTH-8) }' file
whatever h45

从您的问题中不清楚您是否想要whateverwhatever h45="whatever h45或打印字符串的其他部分,所以我选择了我认为最有可能的那个。无论是哪一种,都是微不足道的......

顺便说一句,你的正则表达式似乎没有意义,我只是从你的问题中复制它来缓解你所拥有的和awk解决方案之间的对比。如果你用语言告诉我们它代表什么意思我们可以正确地为你写出来但我认为最可能的事情是它应该只是非双引号,例如:

$ awk 'match($0,/random="[^"]+/) { print substr($0,RSTART+8,RLENGTH-8) }' file
whatever h45

答案 2 :(得分:1)

您也可以单独bash执行此操作:

while read -r; do
    [[ $REPLY =~ random=\"([a-zA-Z0-9]+) ]] || continue
    echo ${BASH_REMATCH[1]}
done < file.txt

如果您的grep版本支持Perl正则表达式,则可以使用回溯断言仅匹配random="后面的文本。

grep -P -o '(?<=random=\")([a-zA-Z0-9]+)' file.txt

答案 3 :(得分:0)

完整性的Perl解决方案。

#% perl -n -e 'print $1, "\n" if m!random="(\S+)!' tt

给出

whatever
whatever

其中tt

#% cat tt

blahblahblahblah random="whatever h45" blahblahblahblah
blahblahblahblah random="whatever h45" blahblahblahblah