我有一个随机文本,后跟一个冒号 ( :
) 和一个空格,然后是一个数字结果,然后是另一个空格和其他任意文本;例如:
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
您不清楚数字后面可能会出现什么。如果可能还有另一个冒号,例如,
eggs: 42 (from: 17 hens)
那么其他答案会给你
17
。如果这就是你想要的,很好(但是请编辑你的问题说出你想要什么)。如果您想要后面的数字第一的冒号,使用^[^:]*
代替^.*
.您对“数字结果”是什么不准确。如果您可能有:
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