【问题标题】:Need help consolidating three sed calls into one需要帮助将三个 sed 调用合并为一个
【发布时间】:2020-09-12 15:53:26
【问题描述】:

我有一个名为 TR_VERSION 的变量,它是一个版本号的 JSON 列表,看起来像这样:

[
    "1.0.1",
    "1.0.2",
    "1.0.3"
]

我想去除所有 JSON 特定字符 - [",]。以下代码有效,但最好合并到一个 sed 调用而不是三个。

TR_VERSION=$(echo $VERSION \
| sed 's|[",]||g' \
| sed 's/\[//' \
| sed 's/\]//')

感谢您的回答!

【问题讨论】:

  • 所以 - 最后,您将使用适当的 JSON 工具来处理 JSON 对象,这是正确的做法。回到您的正则表达式 - 底线(如 Viktor 的回答所示)是您可以包含字符集中的所有字符。在字符集中具有特殊含义的那些(非常小的数字)仍然可以包括在内 - 它们只是必须位于其“特殊含义”没有意义的位置。例如:右括号紧跟在开头的括号之后(只能表示文字],在那里作为元字符没有意义),或者在类的末尾加上破折号-

标签: bash sed sh


【解决方案1】:

永远不要使用 来解析

这是要走的路:

$ jq -r '.[]' < file.json

按预期输出

1.0.1
1.0.2
1.0.3

【讨论】:

  • 啊,很好地使用 -r 选项,这让我重新考虑我目前如何使用 jq 解析 JSON,谢谢!
【解决方案2】:

如果您只想删除所有 ",[] 字符,您可以使用

TR_VERSION=$(echo "$VERSION" | sed 's/[][",]//g')

或者,

TR_VERSION=$(sed 's/[][",]//g' <<< "$VERSION")

[][",] 模式匹配 ][", 字符。

【讨论】:

  • @GillesQuenot 当然不是。我只是建议了一种方法来删除所有",[],而不是解析任何JSON。请参阅答案的顶部。
  • @WiktorStribiżew 感谢您的解决方案非常适合我的用例,@GillesQuenot 我在与问题不太相关的程序的另一部分使用jq解析
【解决方案3】:

如果你真的想避免 JSON parer,仍然没有必要使用sed。你也可以这样做

 TR_VERSION=$(tr -d '[]",' <<<$VERSION)

恕我直言,它的可读性略好于 sed 对应版本。

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多