如何使用 sed 提取两个字符之间的数字字符?

如何使用 sed 提取两个字符之间的数字字符?

我有一个随机文本,后跟一个冒号 ( :) 和一个空格,然后是一个数字结果,然后是另一个空格和其他任意文本;例如:

text: 30 (5 new)

我只需要提取数字30;例如:

30

目前我只有这段代码:

sed 's/.*: //g'

这只给了我这个结果:

30 (5 new)

我缺少什么?

答案1

您的表达式 ( 's/.*: //g') 删除第一部分,但保留所有其余部分。这将整行替换为仅包含所需数字的部分:

sed -re 's/^.*: ([0-9]+) .*$/\1/'

详细信息:^.*:是第一部分(适合该行的开头),您的编号是下一个([0-9]+),它位于括号中以定义稍后可以使用的组,最后是该行的其余部分,直到结尾:.*$。然后将其替换为第一组(我们只有一个):\1

答案2

也许是这样的:

$ echo "text: 30 (5 new)" | sed -e 's/^.*: \([0-9][0-9]*\).*$/\1/'
30

分解一下:

  • ^.*:从行的开头开始匹配以冒号和空格结尾的任意数量的字符
  • 匹配\([0-9][0-9]*\)一个数字。括号定义了我们稍后可以引用的组。
  • 匹配.*$行尾任意数量的字符

我们将 ( s) 整个模式替换为\1,这是第一组的内容(即,我们用括号定义的组 - 数字)。

答案3

  1. 您不清楚数字后面可能会出现什么。如果可能还有另一个冒号,例如,

    eggs: 42 (from: 17 hens)
    

    那么其他答案会给你17。如果这就是你想要的,很好(但是请编辑你的问题说出你想要什么)。如果您想要后面的数字第一的冒号,使用 ^[^:]*代替 ^.*.

  2. 您对“数字结果”是什么不准确。如果您可能有:

    balance: 609.83 (I’m running low on money)
    balance: -17.42 (overdraft!)
    
    • 首先请编辑你的问题是要说明你的数字是什么样的。
    • 您的问题标题说“两个字符之间”。如果您保证数字结果(无论它是什么)后面跟着一个空格(并且不包含任何空格!),然后

      sed 's/^[^:]*: \([^ ]*\).*/\1/'
      

      可能是最直接的解决方案。这将捕获 后面的所有非空白字符。请注意,这将处理数字位于行末尾(后面不跟空格)的情况:

      Blind mice: 3
      

    (注意安迪·道尔顿的回答 还将处理数字位于行尾的情况。)

答案4

您可以尝试以下2种方法

第一种方法使用awk

awk '{print $2}' filename

相关内容