如何使用grep在`name =`之后得到任何东西?

时间:2009-08-08 02:45:42

标签: regex bash grep

我只是在name=之后尝试grep任何东西,只包含空格和字母数字。

e.g:

name=some value here

我得到了

some value here

我完全是新手,以下grep匹配包括name=在内的所有内容。

grep 'name=.*' filename

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:101)

详细here,您需要一个积极的lookbehind子句,例如:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename

-P使grep使用Perl方言,否则你可能需要转义括号。如其他地方所述,您还可以附加-o参数以仅打印匹配的内容。括号中的部分指定您需要字母数字和空格。

使用正面lookbehind子句的好处是“name =”文本不是匹配的一部分。如果grep突出显示匹配的文本,则只会突出显示字母数字(和空格)部分。 -o参数也不会显示“name =”部分。并且,如果你将它转换到另一个可能捕获文本并对其执行某些操作的程序,那么你将不会捕获“name =”部分,尽管你也可以通过使用捕获parenthess来实现。

答案 1 :(得分:22)

试试这个:

sed -n 's/^name=//p' filename

它告诉sed默认打印(-n),用什么都替换你的前缀,如果发生替换则打印。

奖励:如果你真的需要它只匹配只有空格和字母数字的条目,你也可以这样做:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename

这里我们添加了一个匹配空格和字母数字的模式,直到行结束($),如果匹配,我们用括号中的组替换并打印。

答案 2 :(得分:4)

grep不像你期望的那样提取。你需要的是

grep "name=" file.txt | cut -d'=' -f1-

答案 3 :(得分:4)

gawk的

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

或使用bash

str="name=some value here"
IFS="="
set -- $str
echo $1    
unset IFS

str="name=some value here"
str=${str/name=/}

答案 4 :(得分:1)

grep将打印与模式匹配的整行。要仅打印匹配的模式,请使用grep -o选项。您可能还需要使用sed来删除模式的名称=部分。

grep -o 'name=[0-9a-zA-Z ]'  myfile | sed /^name=/d