解析 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
正如评论中已经提到的,使用$grep
是variable 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
我有一个文件,想使用 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
正如评论中已经提到的,使用$grep
是variable 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