密钥名称的grep json值。 (busybox没有选项-P)

时间:2017-07-11 04:55:32

标签: json linux bash

我发现大量的线程讨论过“如何grep json值”。 但遗憾的是我和所有使用grep from busybox(嵌入式linux)的人都没用。此grep版本没有选项“-P”(perl exp)。只有“-E”(扩展正则表达式)可用。

BusyBox v1.20.2 () multi-call binary.

Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...

Search for PATTERN in FILEs (or stdin)

        -H      Add 'filename:' prefix
        -h      Do not add 'filename:' prefix
        -n      Add 'line_no:' prefix
        -l      Show only names of files that match
        -L      Show only names of files that don't match
        -c      Show only count of matching lines
        -o      Show only the matching part of line
        -q      Quiet. Return 0 if PATTERN is found, 1 otherwise
        -v      Select non-matching lines
        -s      Suppress open and read errors
        -r      Recurse
        -i      Ignore case
        -w      Match whole words only
        -x      Match whole lines only
        -F      PATTERN is a literal (not regexp)
        -E      PATTERN is an extended regexp
        -m N    Match up to N times per file
        -A N    Print N lines of trailing context
        -B N    Print N lines of leading context
        -C N    Same as '-A N -B N'
        -e PTRN Pattern to match
        -f FILE Read pattern from file

我有一个json示例:

{
  "one": "apple",
  "two": "banana"
}

现在,我想提取值,例如关键“一”的“苹果”。

grep -E '".*?"' file.json

只是一个例子,它应该是什么样子。

顺便说一句:如何从正则表达式访问组?

如果有任何帮助或替代方案,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用 <?xml version="1.0"?> <t t-name="account.report_invoice"> <t t-call="report.html_container"> <t t-foreach="doc_ids" t-as="doc_id"> <t t-raw="translate_doc(doc_id, doc_model, 'partner_id.lang', 'account.report_invoice_document')"/> </t> </t> </t>

busybox awk
  • busybox awk -F '[:,]' '/"one"/ {gsub("[[:blank:]]+", "", $2); print $2}' 将字段分隔符设置为-F '[:,]':

  • 如果该行包含,,则
  • /"one"/ {gsub("[[:blank:]]+", "", $2); print $2}会出现问题,如果是,则从第二个字段中删除所有水平空格,然后打印字段

如果你想剥去引号:

"one"

示例:

busybox awk  -F '[:,]' '/"one"/ {gsub("[[:blank:]\"]+", "", $2); print $2}'

答案 1 :(得分:0)

我喜欢简单的命令,这些命令增强了可读性并且易于理解。首先,我们必须删除空格以匹配字符串。为此,我通常更喜欢sed命令。之后我们可以使用awk命令查找匹配项。

awk -F: '$1=="one" {print $2}' | sed -r 's/(\t|\s|,)//g' file.json

它将返回:

"apple"

注意:我删除了存在于行尾的逗号(,)。如果您还需要逗号作为输出,请参阅以下命令。

awk -F: '$1=="one" {print $2}' | sed -r 's/(\t|\s)//g' file.json

它将返回:

"apple",

答案 2 :(得分:0)

awk 如果单行 json

解决方案将不起作用

示例:

{"one":"apple","two":"banana"}

遵循 sed 可以:

busybox cat file.json | sed -n 's/.*"one":\([^}, ]*\).*/\1/p'