摆脱 awk 或 sed 中的空格、尾随、下一行

get rid of empty spaces, trailing, next line in awk or sed

我有一个 JSON 输出,我想稍微修改一下:

JSON={"type":"global", "elements":[
    {"type":"car","model":"bmw", "elements":[
        {"type":"door", "number":"3"},
        {...},
        {...}]
    }]
}

我需要将所有内容放在一行中:

 JSON={"type":"global","elements":[{"type":"car","model":"bmw","elements":[{"type":"door","number":"3"},{...},{...}]}]}

我试过这个:

 JSON=`echo "${JSON}" | nawk  'sub(" *","",[=12=])'`

还有这个:

 JSON=`echo "${JSON}" | sed  's/^[ \n\t]*//;s/[ \n\t]*$//'`

但这些都没有帮助我,因为结果是:

 JSON={"type":"global", "elements":[      <--- the remaining space between key-value groups were also supposed to disappear, but they don't
 {"type":"car","model":"bmw", "elements":[
 {"type":"door", "number":"3"},
 {...},
 {...}]
 }]
 }

如果有人能告诉我如何去掉键值组之间的空格,我将不胜感激。

借助 awk,您可以使用 OFS 和 ORS 变量

awk -v ORS= -v OFS= '{=}1' file

只需使用 tr:

删除它们
$ tr -d '[\n\t ]' < file
JSON={"type":"global","elements":{"type":"car","model":"bmw","elements":{"type":"door","number":"3"},{...},{...}}}

来自man tr

-d, --delete

delete characters in SET1, do not translate

我好像来晚了

好吧,就其价值而言,使用纯文本工具处理 JSON 与使用纯文本工具处理 XML 一样危险。例如,在这种特殊情况下,当 JSON 字符串包含空格时,您可能 运行 会遇到问题。

出于这个原因,我建议使用 JSON 处理工具,例如 jq:

JSON=$(echo "$JSON" | jq -c .)

jq 正确解析 JSON 并注意保留其含义,因此这样可以保证输出与输入具有相同的含义。