Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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 什么是'\K';这个正则表达式是什么意思?_Regex_Bash_Grep - Fatal编程技术网

Regex 什么是'\K';这个正则表达式是什么意思?

Regex 什么是'\K';这个正则表达式是什么意思?,regex,bash,grep,Regex,Bash,Grep,给出下面的shell脚本,有人能解释一下grep-Poregex吗 #!/bin/bash # Issue the request for a bearer token, json is returned raw_json=`curl -s -X POST -d "username=name&password=secret&client_id=security-admin-console" http://localhost:8081/auth/realms/master/toke

给出下面的shell脚本,有人能解释一下
grep-Po
regex吗

#!/bin/bash
# Issue the request for a bearer token, json is returned
raw_json=`curl -s -X POST -d "username=name&password=secret&client_id=security-admin-console" http://localhost:8081/auth/realms/master/tokens/grants/access`
# Strip away all but the "access_token" field's value using a Python regular expression
bearerToken=`echo $raw_json | grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)'`
echo "The bearer token is:"
echo $bearerToken
具体来说,我想了解正则表达式的各个部分

grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)'`
以及它是如何工作的。为什么引用这么多?“K”代表什么?我对grep regex有一些经验,但这让我很困惑

这是curl命令的实际输出,shell脚本(grep)根据需要工作,只返回“access_token”值的内容

{“访问令牌”:"EYJHBgCioIji和NOTHISSNTREANDMBS1YZWFSBSi6EYJYB2XLCY6WYJTYW5HZ2UTYZW50cyisinzPZxCzTcTcHBg0ILCjTyW5HZ2UTZZZZZZ2UZLZZZBnRZiIwiidlDyLDMv2LwWxPy2F0AW9UcYZY2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2UcUcUc2WZZZZZ2UcUcUc2UcUcUc2UcUcUcUcUc2W9Uc2W9UcUcUcUcUcUcUcUcHZZZZZZZZ2W9UcUcUcUcUcUcUcUcUcUcUcUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ2DHT0Zuxi“expires\u in:60,“刷新\u expires\u in:1800,“刷新\u令牌”:EYJBGCIOIJZIZIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ2.2.这两个字的意思是:2.这两个字的意思意思是:2.这两个字的意思是:2.这两个字的意思是:2.这两个字的意思是:一个字的意思是:1.这两个字的意思是:2.这两个字的意思是:2.2.2.2.2.2.2.2.这两个字的意思是2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.R我国目前还没有一个10岁的城市。2个2个2个2个2个2个2个5岁的城市是一个2个2个2个2个2个2个2个2个2个2个2个2个2个2岁的城市是一个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2个2“:”Eyjhbgcioizuzi1nij9.EyjuyyyyjiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiBRKORGQSgkas_34rwzhcTE3Iki8h_YVs2vvNIx_eZSOvIzyEcP3IGHuBoxcR6W3E,“不在策略之前”:0,“会话状态”:“62efc05c-1bf5-4f55-b749-5e0eff94155b”


如果有人发现了这篇文章,我最终使用了以下内容:

if hash jq 2>/dev/null; then
  # Use the jq command to safely parse json
  bearerToken=$(echo $raw_json | jq -r '.access_token')
else
  # Strip away all but the "access_token" field's value using a perl regular expression
  bearerToken=$(echo $raw_json | grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)')
fi

由于并非所有regex风格都支持lookbehind,因此Perl通常在以下情况下引入了
\K

a\Kb
当匹配“b”时,
\K
告诉引擎假装匹配尝试从此位置开始

在您的示例中,您希望假设匹配尝试从出现在
“access\u token”:“
text”之后的位置开始

此示例将更好地演示
\K
用法:

~$ echo 'hello world' | grep -oP 'hello \K(world)'
world
~$ echo 'hello world' | grep -oP 'hello (world)'
hello world

请注意,
grep
并不是处理JSON的最佳工具(甚至不是一个好工具)。取而代之的是,它已经知道如何解析JSON了
bearerToken=$(echo“$raw_json”| jq.accessToken”)
要好得多。@chepner谢谢。我在一个流浪者/傀儡/centos的环境中。也许我可以用yum安装jq。@chepner
sudo-yum安装jq
来拯救。谢谢谢谢我还对双引号和单引号的垃圾邮件感到好奇。它确实有效,但我不确定正则表达式是如何被过度引用的。它以
开头“
,它只是单引号字符串中的一个双引号。接下来是一个双引号字符串,其中包含
access_token
;这两个字符串只是连接在一起。最后是一个单引号字符串,其中包含几个双引号。shell将三个字符串的内容连接在一起;例如,
'foo'“bar”'baz'
表示与
“foobarbaz”
相同的事物。整个过程可以更简单地编写为“访问令牌”\s*:\s*“\K([^”]*)”。这与vim中的
\zs
类似