apd*_*dcm 2 ruby bash awk grep json
我有一个分配给变量的字符串:
#/bin/bash
fullToken='{"type":"APP","token":"l0ng_Str1ng.of.d1fF3erent_charAct3rs"}'
Run Code Online (Sandbox Code Playgroud)
我只需要提取l0ng_Str1ng.of.d1fF3erent_charAct3rs不带引号的内容并将其分配给另一个变量。
我知道我可以使用awk, sed, 或 ,cut但我无法绕过原始字符串中的特殊字符。
提前致谢!
编辑:我还没醒,我应该指定这是 JSON。感谢到目前为止的回复。
EDIT2:我正在使用 BSD (macOS)
看起来你那里有一个JSON字符串。请记住,JSON 是无序的,因此如果您下次以不同的顺序输入字符串,大多数 sed、awk、cut 解决方案都会失败。
使用 JSON 解析器最为稳健。
您可以使用 ruby 及其 JSON 解析器库:
$ echo "$fullToken" | ruby -r json -e 'p JSON.parse($<.read)["token"];'
"l0ng_Str1ng.of.d1fF3erent_charAct3rs"
Run Code Online (Sandbox Code Playgroud)
或者,如果您不需要带引号的字符串(这对 Bash 很有用):
$ echo "$fullToken" | ruby -r json -e 'puts JSON.parse($<.read)["token"];'
l0ng_Str1ng.of.d1fF3erent_charAct3rs
Run Code Online (Sandbox Code Playgroud)
或者使用jq:
$ echo "$fullToken" | jq '.token'
"l0ng_Str1ng.of.d1fF3erent_charAct3rs"
Run Code Online (Sandbox Code Playgroud)
即使 JSON 字符串的顺序不同,所有这些解决方案也将起作用:
$ echo '{"type":"APP","token":"l0ng_Str1ng.of.d1fF3erent_charAct3rs"}' | jq '.token'
"l0ng_Str1ng.of.d1fF3erent_charAct3rs"
$ echo '{"token":"l0ng_Str1ng.of.d1fF3erent_charAct3rs", "type":"APP"}' | jq '.token'
"l0ng_Str1ng.of.d1fF3erent_charAct3rs"
Run Code Online (Sandbox Code Playgroud)
但是知道您应该使用 JSON 解析器,您还可以使用 PCRE 并在 Gnu Grep 中进行查看:
$ echo "$fullToken" | grep -oP '(?<="token":)"([^"]*)'
Run Code Online (Sandbox Code Playgroud)
或者在 Perl 中:
$ echo "$fullToken" | perl -lane 'print $1 if /(?<="token":)"([^"]*)/'
Run Code Online (Sandbox Code Playgroud)
如果字符串的顺序不同,这两种方法也都有效。
或者,使用 POSIX awk:
$ echo "$fullToken" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/"token"/){print $(i+1)}}}'
Run Code Online (Sandbox Code Playgroud)
或者,使用 POSIX sed,您可以执行以下操作:
$ echo "$fullToken" | sed -E 's/.*"token":"([^"]*).*/\1/'
Run Code Online (Sandbox Code Playgroud)
这些解决方案从最强大的(使用 JSON 解析器)到更脆弱的(sed)。但我的 sed 解决方案比其他解决方案更好,因为它支持 JSON 字符串中的键、值的顺序不同。
Ps:如果你想从一行中删除引号,这是一个很好的工作sed:
$ echo '"quoted string"'
"quoted string"
$ echo '"quoted string"' | sed -E 's/^"(.*)"$/UN\1/'
UNquoted string
Run Code Online (Sandbox Code Playgroud)