解析 shell 脚本中的键值

parsing key value in shell script

我有一个文件,想使用 shell 脚本从该文件中查找值。

所以我尝试使用以下代码来 grep 值。

VAR=($grep -Po "(?source-no": ")(\d+)" file)

但是报错

grep missing )

文件中的数据如下所示

"source-no" : "123456",

第一种解决方案: 考虑到您需要获取数字作为输出,您可以尝试以下操作。你走在正确的道路上,你需要在这里修复两件事:更正你匹配的正则表达式,在 look behind 你需要修复其中的 " 。然后将其保存到 shell 变量中:以这种形式在 $(grep command) 中使用 grep 命令。

grep -oP '(?<="source-no" : ")(\d+)' Input_file

要将其保存到变量中,请尝试以下操作:

var=$(grep -oP '(?<="source-no" : ")(\d+)' Input_file)

也尽量保持shell变量名小写,专家恕我直言推荐


第二种解法:

grep -oP '(?<= ")[\w\.]+(?=")' Input_file

(?<= ") 匹配以开头的模式,因为 (?=") 匹配以结尾的模式,[\w\d\.]+ 匹配您需要的由单词或数字或点(.)组成的值我猜值模式。


第三个解决方案: 或在此处同时使用正面前瞻和正面回顾:

grep -oP '(?<="source-no" : ")\d+(?=")' Input_file

正如评论中已经提到的,使用$grepvariable expansion

请注意,这部分模式 (?source-no": ") 不是有效模式,并且在冒号前也缺少一个 space。

由于您对 Perl 兼容的正则表达式使用 -P,因此您可以使用 \K 来清理当前匹配缓冲区。

"source-no" : "\K\d+(?=")
  • "source-no" : "字面匹配
  • \K忘记目前匹配的是什么
  • \d+(?=") 匹配 1+ 位,直接向右断言 "

例如

VAR=$(grep -Po '"source-no" : "\K\d+(?=")' file)
echo $VAR

输出

123456