匹配模式后提取子字符串

时间:2018-12-08 12:05:38

标签: json regex grep

我正在尝试匹配字符串中的模式后提取子字符串。

现在我无法共享我的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)[^"]+'

问题在于,我找不到一种方法来检索所需的其余子字符串,因为在该反斜杠后还有一个引号。

任何想法我该如何解决?

2 个答案:

答案 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>