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

nga*_*ame 60 regex bash grep

我被困在尝试grep之后name=,只包括空格和字母数字.

例如:

name=some value here
Run Code Online (Sandbox Code Playgroud)

我明白了

some value here
Run Code Online (Sandbox Code Playgroud)

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

grep 'name=.*' filename
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢.

mar*_*ets 106

如此处所述,您需要一个积极的lookbehind子句,例如:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename
Run Code Online (Sandbox Code Playgroud)

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

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

  • 仅供参考:-P从10.8起不适用于OSX (22认同)
  • grep实际上是否支持积极的观察? (2认同)
  • 我通常更喜欢不那么麻烦的`\K` 模式,因为它更容易阅读,例如`grep -oP 'name=\K[ A-Za-z0-9]*' filename`。此外,[perl 文档声称具有性能优势](https://perldoc.perl.org/perlre.html#Lookaround-Assertions) 和 `\K`。不确定这是否适用于一般的 PCRE 引擎或仅适用于 perl 实现 (2认同)

Joh*_*nck 22

试试这个:

sed -n 's/^name=//p' filename
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 只匹配空格和alphas是微不足道的,我会为此添加一些东西.至于只使用grep,那么排名靠前的答案现在使用grep AND sed ......至少这只使用一个进程.:) (2认同)

Ste*_*ini 7

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

grep "name=" file.txt | cut -d'=' -f1-
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 5

高克

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 
Run Code Online (Sandbox Code Playgroud)

或用bash

str="name=some value here"
IFS="="
set -- $str
echo $1    
unset IFS
Run Code Online (Sandbox Code Playgroud)

要么

str="name=some value here"
str=${str/name=/}
Run Code Online (Sandbox Code Playgroud)