sed 匹配字符串中零个或多个空格

sed 匹配字符串中零个或多个空格
function getVal {
  sedPattern='s/^.*"keyVal":"\([^"]*\)".*$/\1/'
  finalSedPattern=${sedPattern/keyVal/$2}
  echo $(sed $finalSedPattern  <<< $1)
}

这是我使用sed.它接受 json 字符串、键名并返回如下值:

myJson='{"hello":"sk"}'
val=$(getVal $myJson hello)
echo $val

印刷,sk

但有时,我的 json 字符串可能包含也可能不包含空格,因为,

myJson='{"hello" : "sk"}'

在这种情况下,该功能将失败。我尝试通过添加[ ]匹配零个或多个空格来调整上述模式,

sedPattern='s/^.*"keyVal"[ ]+:"\([^"]*\)".*$/\1/'

它会抛出错误,

unterminated `s' command

我如何在 sed 中提供非捕获模式组?

答案1

您的sedPattern报价有一些问题。您正在尝试将同一个引用匹配两次。另外,+ 用于表示一个或多个。对于 0 个或多个,使用 *。
注意:下面的代码未经测试,但应该可以帮助您继续。

sedPattern='s/^.*"keyVal"[ ]*:.*\(".*"\).*$/\1/'

答案2

您应该引用变量扩展(只是代码中的一个示例):

sed $finalSedPattern

不加引号,并将按空格分割(使用时)。你应该使用:

sed "$finalSedPattern"

带引号的函数:

function getVal {  
    sedPattern='s/^.*"keyVal":"\([^"]*\)".*$/\1/1'
    finalSedPattern="${sedPattern/keyVal/$2}"
    echo "$(sed "$finalSedPattern"  <<< "$1")"
}

并带有可选空格:

function getVal {
    sedPattern='s/^.*"keyVal"[ ]\{0,\}:[ ]\{0,\}"\([^"]*\)".*$/\1/1'
    finalSedPattern="${sedPattern/keyVal/$2}"
    echo "$(sed "$finalSedPattern"  <<< "$1")"
}

相关内容