在文本字符串中搜索模式,然后提取匹配的模式

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,当两者都匹配时,打印它们。

【讨论】:

以上是关于在文本字符串中搜索模式,然后提取匹配的模式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

关于正则的一点总结

js 常用正则表达式表单验证代码

正则表达是式

正则表达式

正则表达式