Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 格雷普:群捕获_Regex_Linux_Bash_Grep - Fatal编程技术网

Regex 格雷普:群捕获

Regex 格雷普:群捕获,regex,linux,bash,grep,Regex,Linux,Bash,Grep,我有以下字符串: {"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 我需要得到“scheme version”的值,在本例中是1234 我试过了 grep -Eo "\"scheme_version\":(\w*)" 不管它回来了 "scheme_version":1234 我怎样才能做到?我知道我可以添加sed调用,但我更喜欢使用单个grep进行添加。您需要

我有以下字符串:

{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
我需要得到“scheme version”的值,在本例中是1234

我试过了

grep -Eo "\"scheme_version\":(\w*)"
不管它回来了

"scheme_version":1234

我怎样才能做到?我知道我可以添加sed调用,但我更喜欢使用单个grep进行添加。

您需要使用look-behind断言,以便它不包含在匹配中:


grep-Po'(?这可能适合您:

echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' |
sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p'
1234
很抱歉,它不是grep,因此如果您愿意,请忽略此解决方案

或者坚持使用grep并添加:

grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2

我建议您使用jq来完成这项工作。jq是一个命令行JSON处理器

$ cat tmp
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}

$ cat tmp | jq .scheme_version
1234
您可以这样做:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'

作为SiegeX建议的正向查找方法的替代方法,您可以使用
\K
转义序列将匹配起点重置为直接在
scheme\u版本“
之后。例如

$ grep -Po 'scheme_version":\K[0-9]+'
这将在匹配了
scheme_version:“
后重新启动匹配过程,其性能往往比正向查找好得多。在regexp101上比较这两种方法表明,重置匹配开始方法需要37个步骤和1ms,而正向查找方法需要194个步骤和21ms


您可以自己比较性能,也可以在中阅读有关重置匹配起点的更多信息。

以避免使用
grep
s PCRE功能,该功能在中可用,但在中不可用,另一种方法是使用,例如


相关:

改进@poton的答案,该答案只适用于获得“scheme\u版本”,您可以使用以下表达式:

$echo'{“\u id”:“方案版本”,“方案修订版”:“4-cad1842a7646b4497066e09c3788e724”,“方案版本”:1234}'\sed-n's/*“\u id:[“]*\([^(“,})]*\[“,}]./\1/p”
计划(修订版)
$echo'{U id:“方案版本”,“方案修订版”:“4-CAD1842A7646B449706E09C3788E724”,“方案修订版”:1234}'sed-n's/*“\U修订版”:[“]*\([^(“,})]*\)[“,}]./\1/p”
4-cad1842a7646b4497066e09c3788e724
$echo'{U id:“方案版本”,“方案修订版”:“4-CAD1842A7646B449706E09C3788E724”,“方案版本”:1234}sed-n's/*“方案版本”:[“]*\([^(“,})]*\)[“,}]./\1/p”
1234

我认为仅使用“grep”是不可能的。几年前,我做了很多字符串操作,经常将grep管道化为“sed”或“cut”之类的内容。我建议你学习“piping”和“cut”命令。我不经常使用grep,但也许你可以使用look-behind表达式,如中接受的答案所述。使用Hmm我得到了grep:对-P选项的支持没有编译成这个--disable perl regexpbinary@Stipa如果没有PCRE支持,您无法使用grep做您想做的事情,因为它不支持反向引用,也就是说,
\1
确切地说,它是一种“积极的回头看”的魅力“对于我们这些幸运地拥有已编译的
-P
支持(或顽固地重建grep…)的人来说,这比公认的答案要好得多。当您有多个命名组时,每个组都以新行输出。有没有办法把它打印在同一行上?e、 g.
cat~/mydoc | grep-Po'(?)[^这似乎是我最好的选择。您好,谢谢您的回答。获取“scheme\u version”值非常有效,但获取“\u id”值却不起作用。这个sed表达式对我有效,我必须回答:
sed-n的/*“scheme\u version”:[“]*\([^(,})]*)[,].*/\1/p'
虽然这个代码块可以回答OP的问题,但是如果你解释一下这个代码与问题中的代码有什么不同,你改变了什么,为什么你改变了它,为什么不介绍其他人就解决了这个问题,这个答案会更有用。哇,谢谢!
$ rg -o 'scheme_version.?:(\d+)' -r '$1' <file.json 
1234
$ python -mjson.tool file.json | rg -o 'scheme_version[^\d]+(\d+)' -r '$1'
1234