我有数字以特殊字符@
开始,以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@
chars*
-零或多个空白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