bash 字符串连接中的多余空间

Posted

技术标签:

【中文标题】bash 字符串连接中的多余空间【英文标题】:Undesirable space in bash string concatenation 【发布时间】: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 $nump


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"'后你会怎么做? 【参考方案1】:

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

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

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

【讨论】:

你是对的,通常我使用 jq 来解决问题,但我只有一个 bash env 来解决问题,所以我无法安装它。此功能可能仅适用于这项工作。 对于 10000% 你有 perl,还有github.com/step-/JSON.awk @KamilCuk : "使用 jq,使用 Python 或 Perl" 或 Ruby :-D

以上是关于bash 字符串连接中的多余空间的主要内容,如果未能解决你的问题,请参考以下文章

kettle之行转列,删除多余连接符

如何在 Bash 中连接字符串变量

sh Azure BASH解析连接字符串示例

在bash中,如何将N个参数连接在一起作为空格分隔的字符串

bash shell 脚本:条件字符串连接

Bash Expect Telnet:处理服务器关闭的过早连接