去除awk或sed中的空格、尾随字符和换行符

4

我有一个 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(" *","",$0)'`

并且这个:

 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"},
 {...},
 {...}]
 }]
 }

我希望您能帮助我解决键值对之间的空格问题。
3个回答

10

我似乎有点晚了。

不过,就这个问题而言,使用纯文本工具处理JSON与使用纯文本工具处理XML一样危险。在特定情况下,例如当您的JSON字符串包含空格时,可能会遇到问题。

因此,我建议使用JSON处理工具,例如jq

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

jq 能够正确解析JSON并保留其含义,因此通过这种方式输出的结果保证与输入的内容具有相同的含义。


8
使用awk,你可以使用OFS和ORS变量。
awk -v ORS= -v OFS= '{$1=$1}1' file

如何按照我的方式进行操作,而不需要在结尾加上'file'?类似这样:JSON=echo "${JSON}" | awk 'BEGIN {ORS=""; OFS=""} sub(" *","",$0)' - 6axter82
@erikrem:你可以使用管道来完成相同的操作:someprogram | awk -v ORS= -v OFS= '{$1=$1}1' - user000001
1
@erikrem 只需使用管道:echo "..." | awk -v ORS= -v OFS= '{$1=$1}1'。如果您没有向 awk 提供文件,则它会从 stdin 读取,这是来自前一个管道的内容。 - fedorqui

1

只需使用 tr 删除它们:

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

来自 man tr:

-d, --delete

删除SET1中的字符,不进行翻译


使用 tr 命令删除空格是“危险”的,因为它会删除字符串中的空格,这当然会改变语义。 - peak
@peak,这里JSON的事实是不相关的,重点是OP在问题标题中提到的“摆脱空格、尾随、下一行”。否则,去掉所有空格当然就没有意义了,你的评论也是有道理的。 - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接