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
我有以特殊字符 @
开头并以 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