在文本字符串中搜索模式,然后提取匹配的模式
Posted
技术标签:
【中文标题】在文本字符串中搜索模式,然后提取匹配的模式【英文标题】:Search for Pattern in Text String, then Extract Matched Pattern 【发布时间】:2017-08-04 12:04:48 【问题描述】:我正在尝试匹配然后从文本字符串中提取模式。我需要在文本字符串中提取与以下内容匹配的任何模式:
10289 20244
文本文件:
KBOS 032354Z 19012KT 10SM FEW060 SCT200 BKN320 24/17 A3009 RMK AO2 SLP187 CB DSNT NW T02440172 10289 20244 53009
我正在尝试使用以下 bash 代码来实现此目的:
Bash 代码:
cat text_file | grep -Eow '\s10[0-9].*\s' | head -n 4 | awk 'print $1'
上述代码尝试搜索以10
开头后跟三个数字字符的大约五个数字字符的任意组。匹配此模式后,代码打印出文本字符串的其余部分,捕获第二组五个数字字符,以 20
开头。
我需要一种更好、更可靠的方法来完成此操作,因为目前,此代码失败。我需要的数字组用空格分隔。我试图通过将\s
插入代码的 grep 部分来解决此问题。
【问题讨论】:
【参考方案1】:grep 解决方案:
grep -Eow '10[0-9]3\b.*\b20[0-9]3' text_file
输出:
10289 20244
[0-9]3
- 匹配 3 位数字
\b
- 字边界
【讨论】:
这将匹配10289 12345 RMX 67890 FOO 20244
- 这是否可取?【参考方案2】:
awk 'print $(NF-2),$(NF-1)' text_file
10289 20244
在最后一个和上一个打印。
【讨论】:
虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!【参考方案3】:awk '$17 ~ /^10[0-9]3$/ && $18 ~ /^20[0-9]3$/ print $17, $18 ' text_file
这将检查“10xxx”的字段 17 和“20xxx”的字段 18,当两者都匹配时,打印它们。
【讨论】:
以上是关于在文本字符串中搜索模式,然后提取匹配的模式的主要内容,如果未能解决你的问题,请参考以下文章