如何在Unix中grep这个模式

时间:2014-06-28 09:08:26

标签: regex shell unix grep

我想grep这个特殊的模式。模式如下

**xMT123xMT123x**ABCxxxxxxxxxxxxxxxxxx_123_29887

文件test.txt里面有以下数据

NNN**xMT123xMT123x**ABCxxxxxxxxxxxxxxxxxx_123_29887_20140628.csv

我尝试使用grep" ** xMT123xMT123x ** ABCxxxxxxxxxxxxxxxxxx_123_29887" test.txt但它没有返回任何东西。请建议

编辑:

嗨,基本上我是在一个循环中,有时我只能得到这种模式的文件。所以目前我正在推出像grep" $ i" test.txt适用于所有情况,除非我必须遇到这样的模式。

我实际上正在为确切的file_number,文件序列而努力。如果它说123_29887它将是123_29887。感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用:

grep -P "(?i)\*\*[a-z\d]+\*\*[a-z]+_\d+_\d+" somepath
  • (?i)打开不区分大小写的模式
  • \*\*匹配两个开场明星
  • [a-z\d]+匹配字母和数字
  • \*\*匹配另外两颗星
  • [a-z]+匹配字母
  • _\d+_\d+匹配下划线,数字,下划线,数字

如果您需要更具体(例如,您知道一组数字总是有三位数),您可以替换表达式的某些部分:例如,\d+变为\d{3} < / p>

匹配文字但尚未知的模式:\Q\E

如果您收到需要匹配的文字模式,例如**xMT123xMT123x**ABCxxxxxxxxxxxxxxxxxx_123_29887,则问题是需要转义特殊的正则表达式字符,例如*。如果整个字符串是文字,我们通过在\Q\E之间转义整个字符串来完成此操作:

grep -P "\Q**xMT123xMT123x**ABCxxxxxxxxxxxxxxxxxx_123_29887\E" somepath

当然,在循环中,您可以通过在两端连接\Q\E来以编程方式构建该正则表达式。