我正在尝试匹配字符串中的模式后提取子字符串。
现在我无法共享我的Hole文件,但让我们来看这个例子。
通过此字符串:
{"code":"S02A5","name":"18\" Leichtmetallräder Doppelspeiche 397","price":"0","standard":"false"}
我要提取此子字符串
18\" Leichtmetallräder Doppelspeiche 397
到目前为止,我尝试了以下方法:
这与许多结果匹配
grep -oP '(?<="code":".....","name":")[^"]+'
我知道“ name”:“ 之后的第一个字符始终为 1 ,因此我尝试在以下命令中使用它,返回值为 8 \ ,这还不错,因为我之后可以添加 1 。
grep -oP '(?<="code":".....","name":"1)[^"]+'
问题在于,我找不到一种方法来检索所需的其余子字符串,因为在该反斜杠后还有一个引号。
任何想法我该如何解决?
答案 0 :(得分:2)
看起来像JSON,例如使用jq
:
$ jq '.name' file
"18\" Leichtmetallräder Doppelspeiche 397"
或
$ jq -r '.name' file
18" Leichtmetallräder Doppelspeiche 397
更新:
如果您需要使用grep
$ grep -oP '(?<="name":")(\\"|[^"])+' file
18\" Leichtmetallräder Doppelspeiche 397
解释:
(?<="name":")
在"name":"
\"
或非引号 OR :
也许应该是:
$ grep -oP '(?<="name":")((?<![^\\]\\)\\"|[^"])+' file
因为它将与\"
和\\\"
匹配,但与\\"
不匹配
答案 1 :(得分:0)
如果您正在考虑使用Perl,这应该可以解决
/tmp> export data='{"code":"S02A5","name":"18\" Leichtmetallräder Doppelspeiche 397","price":"0","standard":"false"}'
/tmp> echo $data | perl -ne ' /\"name\":(.+?),/ and print "$1\n" '
"18\" Leichtmetallräder Doppelspeiche 397"
/tmp>