【问题标题】:Filter string only from line that matches regex仅从匹配正则表达式的行中过滤字符串
【发布时间】:2018-02-26 09:00:17
【问题描述】:

我有一些前面的代码输出这一行。现在我想只隔离“us-west1-c”部分中的信息。但是,此信息可以更改,尽管格式相同。例如,它会读作“us-east1-b”或“europe-west2-c”。因此,正则表达式可以说是 *-*-* 。但是,我似乎找不到使用此正则表达式从行中仅过滤此值的方法。

test-group  us-west1-c  zone   default  Yes      1

我试过了:

grep -ow '*-*-*'

不产生任何输出。

我也试过了:

sed 's/.*\(*-*-*\).*/\1/'

这又失败了。

如何,我可以只输出符合我要求的字符串吗?

【问题讨论】:

  • 如果是第二个非空白子串,使用awk '{print $2;}'
  • 感谢您展示您的尝试,也请在 CODE TAGS 中发布预期结果。

标签: regex bash sed grep


【解决方案1】:

现在我想只隔离“us-west1-c”部分中的信息。但是,此信息可以更改,尽管格式相同。例如,它会读作“us-east1-b”或“europe-west2-c”。

您的字符串有 6 个“列”,您想获取第 2 列中的值。使用awk

... | awk '{print $2;}'

请参阅online demo

如果*-*-* 格式后只有一个值,请使用

grep -o '[^ -]*-[^ -]*-[^ -]*'
# or
grep -o '[^[:blank:]-]*-[^[:blank:]-]*-[^[:blank:]-]*'

其中[^[:blank:]-]* 匹配除空格和- 之外的0 个或多个字符。见another online demo

【讨论】:

    【解决方案2】:

    你可能想要这样的东西:

     \w+-\w+-\w
    

    【讨论】:

      【解决方案3】:

      这应该可以,我测试过。

      grep "[^ ]*-[^ ]*-[^ ]*"
      

      【讨论】:

      • 如果您不确定答案,可以先将其作为评论发布?
      猜你喜欢
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2021-10-29
      • 2012-06-05
      • 2013-12-25
      相关资源
      最近更新 更多