Linux Bash grep从匹配字符串中提取单词



我有数字以特殊字符@开始,以900结束,现在我想提取排除它们之间的文本。我的代码:

>> cat demo.txt
asdfsdf
@ 1234900 asdf dfasd
asdf @ 1345900-asdfad wer
@ 678900-asdfa adf 
>> grep -Po '@K.*900' demo.txt
1234900
1345900
678900

预期回答:

1234
1345
678

可以使用

grep -oP '@s*Kd+?(?=900)'

参见regex演示。细节:

  • -o-选项使grep输出所有匹配的子字符串,而不是发生匹配的行
  • P-启用PCRE正则表达式引擎而不是默认的POSIX BRE
  • @- a@char
  • s*-零或多个空白
  • K-匹配重置操作符丢弃到目前为止匹配的所有文本
  • d+?-一个或多个数字,尽可能少
  • (?=900)-直到900字符序列第一次(最左边)出现。

查看在线演示:

#!/bin/bash
s='asdfsdf
@ 1234900 asdf dfasd
asdf @ 1345900-asdfad wer
@ 678900-asdfa adf '
grep -oP '@s*Kd+?(?=900)' <<< "$s"

输出:

1234
1345
678

最新更新