【问题标题】:Why is my sed script not returning the data I expect?为什么我的 sed 脚本没有返回我期望的数据?
【发布时间】:2019-07-09 20:09:17
【问题描述】:

我编写了一个 sed 脚本来从命令的多行输出中提取字段的值,但它不起作用,而且我看不出有什么问题。

$ cf target | sed -e 's/space:\s+\(\S+\).*/\1/p'
api endpoint:   https://api.sys.gn01.pcf.my.com
api version:    2.112.0
user:           userid
org:            cart-creation
space:          stage

我希望看到值 stage,但是当我使用 -n 选项时,我根本看不到任何输出。我取出上面的-n 只是为了显示我的命令的输出是什么样的。

【问题讨论】:

  • + 是扩展正则表达式 (ERE) 的一部分。 Sed 默认使用基本正则表达式 (BRE),它没有那个量词。 GNU sed 将其作为扩展提供,但必须对其进行转义:\+
  • 似乎更容易做到awk '$1 == "space:" { print $2}'
  • @BenjaminW.,在这种情况下它是必需的,因为 OP 想要匹配它以便 可以 被丢弃。也许只需要sed -n 's/^space:[[:blank:]]\+//p'
  • 谢谢,我对 awk 不太熟悉,但你说得对,它超级简单,我会用它。

标签: sed


【解决方案1】:

您在 cmets 中得到了合理的 awk 答案,但请考虑使用这种方法:

$ awk '{t=$0; sub(/:.*/,"",t); sub(/^[^:]+:[[:space:]]*/,""); f[t]=$0} END{print f["space"]}' file
stage

$ awk '{t=$0; sub(/:.*/,"",t); sub(/^[^:]+:[[:space:]]*/,""); f[t]=$0} END{print f["api version"]}' file
2.112.0

$ awk '{t=$0; sub(/:.*/,"",t); sub(/^[^:]+:[[:space:]]*/,""); f[t]=$0}
    END{print f["space"], f["org"], f["api version"]}' file
stage cart-creation 2.112.0

$ awk -v n='space' '{t=$0; sub(/:.*/,"",t); sub(/^[^:]+:[[:space:]]*/,""); f[t]=$0} END{print f[n]}' file
stage

因为它允许您仅按名称以任何顺序打印您喜欢的任何值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2021-05-30
    • 1970-01-01
    • 2015-10-17
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多