我正在努力使用Bash正则表达式

时间:2016-09-16 03:12:15

标签: regex bash shell

我很沮丧,试图找出如何使用正则表达式做任何有用的事情。我对我所做的一切都完全不确定,而且我已经试错了;这是没有效果的。

我正在尝试列出当前目录中以字母开头,包含数字,以点后跟小写字符结尾的文件等。 所以我知道一封信的开头是:

^[a-zA-Z]

但我不知道如何使用CONTAINS来表示这个数字。我知道带点的结尾可以是[\.]*,但我不确定。我发现$也用于匹配单词末尾的字符串。

我不知道我是否应该使用find和正则表达式来执行此操作,或ls | grep ....我完全迷失了。任何方向都会受到赞赏。

我想我想问的具体问题是如何将表达式粘合在一起。例如,我试过ls | grep ^ [a-zA-Z] [0-9]但这只显示以字母开头的文件,后跟一个数字。我不知道怎么写一个以字母开头的正则表达式,然后添加下一个要求,即。包含一个数字。

2 个答案:

答案 0 :(得分:1)

  • 以字母开头:^[a-zA-Z]
  • 包含一个数字:.*[0-9].*
  • 以小写和小写字母结尾:\.[a-z]$

合:

^[a-zA-Z].*[0-9].*\.[a-z]$

查找与正则表达式匹配的文件的最佳方法是使用find -regex。当您使用时隐含了^$锚点,因此您可以省略它们。您需要在前面添加.*/以匹配任何目录,因为-regex匹配目录和文件名。

find -regex '.*/[a-zA-Z].*[0-9].*\.[a-z]'

答案 1 :(得分:0)

网上有大量文档,例如。 GNU's Reference Manual

您的特定示例需要以下内容:

^[:alpha:].*[:digit:].*\.[:lower:]$

或者POSIX类不可用:

^[a-zA-Z].*[0-9].*\.[a-z]$

您可以阅读:

  • 行首
  • 一封信(大写或小写)
  • 任何字符,零次或多次
  • 一个数字
  • 任何字符,零次或多次
  • 一个点(必须用反斜杠转义)
  • 小写字母
  • 行尾

在确定正则表达式后,您可以在要查找文件的目录中使用ls

cd <dir>
ls -1 | grep '^[a-zA-Z].*[0-9].*\.[a-z]$'

注意:我试图根据一些评论改进我的答案。