【问题标题】:Extract pieces of complex string提取复杂的字符串片段
【发布时间】:2015-01-20 17:06:21
【问题描述】:

如何从这个字符串中获取一些值?

使用函数 abs 使用问题类型 ps 在 0.0 秒内找到总成本为 8 的路径 搜索节点扩展:183 个胜利!得分:502 平均得分:502.0 得分:502.0 胜率:1/1 (1.00) 记录:获胜

在此示例中,我需要总成本 (8) 和扩展节点 (183) 的值。 (也许在另一个处决中我有 47 个。)

我试过${str:119:1},但有时值会变为 10 或 100,而我只能得到一位数。我需要完整的价值。

【问题讨论】:

  • 假设您将多次执行此操作,您可能需要考虑获得更清晰的输出,这将简化数据提取,或切换到设计用于解析或查询的输出, IE。 json 或 xml。或者编写一个预处理器来删除不需要的单词,即胜利! 1/1 或 1.0。并将 2word 短语转换为 1word,即 AvgScore、WinRate、SearchNodes(或 nodesExpanded)。祝你好运!

标签: linux string bash split


【解决方案1】:

awk 可以将字符串拆分为“单词”并打印出来。示例:

$ awk '{ print $3 }' <<< 'using function abs using [...]'
abs

【讨论】:

    【解决方案2】:

    grep可以帮到你

    例子

    $ grep -oP '(nodes expanded:|total cost of) [0-9]+' inputFile
    total cost of 8
    nodes expanded: 183
    

    如果你没有什么字符串那么

    $ grep -oP '(nodes expanded:|total cost of) \K[0-9]+' input
    8
    183
    

    【讨论】:

      【解决方案3】:

      提取这些数字:

      $ echo "$str" | awk -v RS="" '{print $14,$21}'
      8 183
      

      如果您想将这些值捕获为命名方便的 shell 变量:

      $ cost=$(echo "$str" | awk -v RS="" '{print $14}')
      $ expanded=$(echo "$str" | awk -v RS="" '{print $21}')
      

      为了证明上述方法有效:

      $ echo cost=$cost expanded=$expanded
      cost=8 expanded=183
      

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        相关资源
        最近更新 更多