如何使用 grep 在 `name=` 之后获取任何内容?

Posted

技术标签:

【中文标题】如何使用 grep 在 `name=` 之后获取任何内容?【英文标题】:How to use grep to get anything just after `name=`? 【发布时间】:2010-11-17 21:10:49 【问题描述】:

我一直试图在 name= 之后尝试 grep 任何内容,仅包含空格和字母数字。

例如:

name=some value here

我明白了

some value here

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

grep 'name=.*' filename

非常感谢任何帮助。

【问题讨论】:

echo 'name=some value here' | grep -Po 'name=\K[ A-Za-z0-9]*' 【参考方案1】:

详细here,你需要一个肯定的lookbehind子句,例如:

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

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

使用肯定的lookbehind 子句的优点是“name=”文本不是匹配的一部分。如果 grep 突出显示匹配的文本,它只会突出显示字母数字(和空格)部分。 -o 参数也不会显示“name=”部分。而且,如果您将它转换到另一个程序(例如 sed),它可能会捕获文本并对其进行处理,您将不会捕获“name=”部分,尽管您也可以通过使用捕获括号来做到这一点。

【讨论】:

grep 真的支持正向回溯吗? 我也担心这个,所以我在我的 Windows PC 上尝试了它,这就是我必须使用 -P 参数的原因。它可能支持其他风格(可能不是-G),但我不知道元素的正确转义。我正在使用 grep 2.5.1。 我用 grep -P 得到了这个: grep: 对 -P 选项的支持未编译到这个中 这是在 Ubuntu Hardy (Linux 2.6.24) 上。在另一台 Linux 机器上,它失败并显示略有不同的错误消息,在 Solaris 10 上也是如此。 @MatthieuRiegler 如果您安装 gnu grep 即 brew install grep --default-names 会起作用 我通常更喜欢不那么繁琐的\K 模式,因为它更容易阅读,例如grep -oP 'name=\K[ A-Za-z0-9]*' filename。另外,perl docs claim a performance benefit 和 \K。不确定这是否适用于一般的 PCRE 引擎或仅适用于 perl 实现【参考方案2】:

试试这个:

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

它告诉 sed 默认不打印任何内容 (-n),用任何内容替换您的前缀,如果替换发生则打印。

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

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

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

【讨论】:

很可能是一个非常合适的解决方案,但提问者询问了 grep... 并且它不只匹配空格和字母数字。 只匹配空格和字母是微不足道的,我会为此添加一些东西。至于只使用 grep,好吧,现在排名靠前的答案使用 grep 和 sed ......至少这只使用一个进程。 :) 我也喜欢你的回答,因为我现在也在和sed 搞混了。感谢您的提示!【参考方案3】:

呆呆

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】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

这两个进程是多余的。如果您必须使用 sed,也可以单独使用它。

以上是关于如何使用 grep 在 `name=` 之后获取任何内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取与正则表达式匹配的第一行之后的文件部分

如何从linux中的文件中grep和修改环境变量?

在字符后获取字符串[重复]

我可以在我想要的字符串之前或之后 grep 一定数量的行吗? [复制]

如何在模式后grep一个字符串?

如何在 N 行中 grep 多个字符串