如何使用正则表达式在Unix中搜索文件?

时间:2015-12-23 08:43:13

标签: regex linux shell unix

我有以下两个不同类别的文件: 第1类: MAA MAB 苹果电脑 狂 MAE MAF MAG MAH MAJ MBA MBB MBC MBD MBE MDA MDD

和第2类: MCA MCB MCC MCD MCE MCF MCG MDB

所以我的问题是:如何编写正则表达式,以便我只能从类别1中找到文件?

我不想做硬编码的脚本,期待来自聪明人的一些逻辑。

我正在尝试这个: 找 。 -regex“* [M] [A,B,D] [A,B,C,D,E,F,J] .txt”

3 个答案:

答案 0 :(得分:0)

这很简单:

ls -l | grep "MAA\|MAB\|MAC\|MAD\|MAE\|MAF\|MAG\|MAH\|MAJ\|MBA\|MBB\|MBC\|MBD MBE\|MDA\|MDD"

好的,所以你不想要硬编码。那么是的,你应该说明不应该与-v

匹配的模式
ls -l | grep -v "MC." | grep -v "pattern2" | .... 

答案 1 :(得分:0)

你的问题不是很精确,但是从你的尝试中我得出结论,你正在寻找名字以.... MAA.txt,... MAB.txt等结尾的文件,并且位于你的工作目录或下面的某个地方。

您也没有提及您使用的是哪个shell。以下是使用zsh的示例 - 无需在此处编写正则表达式:

ls ./**/*M{AA,AB,AC,AD,AE,AF,AG,AH,AJ,BA,BB,BC,BD,BE,DA,DD}.txt

答案 2 :(得分:0)

  

我正在尝试这个:找到。 -regex" * [M] [A,B,D] [A,B,C,D,E,F,J] .txt"

这里的错误是:

  • 正则表达式中任何字符的通配符为.*,与普通文件名模式中的*不同。
  • 您在第三个括号表达式中忘记了GH
  • 您没有排除第2类名称MDB

此外:

  • 括号表达式的字符不能用,分隔。
  • 包含单个项目([M])的括号表达式只能替换为项目M)。

这导致:

find . -regex ".*M[ABD].*" -not -name "MDB*"

或者,没有正则表达式:

find . -name "M[ABD]*" -not -name "MDB*"