如何使用 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=` 之后获取任何内容?的主要内容,如果未能解决你的问题,请参考以下文章