【问题标题】:Undesirable space in bash string concatenationbash 字符串连接中的多余空间
【发布时间】:2022-01-07 11:45:34
【问题描述】:

我无法弄清楚我的以下 bash 脚本有什么问题:

#!/bin/bash

function jsonValue() {
    key=$1
    num=$2
    awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$key'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
}

json='{"_id": "dummy_id","title": "dummy_title"}'
id=$(echo $json | jsonValue _id)
title=$(echo $json | jsonValue title)

echo ${id}/${title}

结果是:

dummy_id title/ dummy_title

函数结果不包含空格。 你知道这个函数有什么问题吗?

【问题讨论】:

  • 您没有在 FS 中包含空格,因此该字段为 ' "dummy_title"'(带有前导空格)。
  • 似乎是jq 的工作。
  • 您应该将该脚本复制/粘贴到shellcheck.net 并修复它会告诉您的问题。另请参阅how-do-i-use-shell-variables-in-an-awk-script
  • 拥有json='{"_id": "1", "title": "this, is; a \"title\" {1}"}'后你会怎么做?

标签: bash awk sed tr


【解决方案1】:

你知道这个函数有什么问题吗?

问题在于您的解析器非常糟糕,并且无法处理在 : 和值的开头之间有任何空格的 JSON 字符串。它也不处理值中嵌入的,;"

不要重新发明轮子 - JSON 是一种众所周知的格式。使用旨在处理 JSON 的工具和库。使用jq,使用 Python 或 Perl。

【讨论】:

  • 你是对的,通常我使用 jq 来解决问题,但我只有一个 bash env 来解决问题,所以我无法安装它。此功能可能仅适用于这项工作。
  • 对于 10000% 你有 perl,还有github.com/step-/JSON.awk
  • @KamilCuk : "使用 jq,使用 Python 或 Perl" 或 Ruby :-D
猜你喜欢
  • 2011-09-02
  • 2014-09-07
  • 2013-03-09
  • 2018-11-10
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多