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

Linux Bash grep extract word from matching string

我有以特殊字符 @ 开头并以 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*\K\d+?(?=900)'

regex demo详情:

  • -o - 该选项使 grep 输出所有匹配的子字符串而不是匹配发生的行
  • P - 启用 PCRE 正则表达式引擎而不是默认的 POSIX BRE
  • @ - 一个 @ 字符
  • \s* - 零个或多个空格
  • \K - 匹配重置运算符丢弃目前匹配的所有文本
  • \d+? - 一位或多位,越少越好
  • (?=900) - 直到最左边第一个 900 字符序列出现。

参见 online demo:

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

输出:

1234
1345
678