使用Grep匹配文件名

时间:2011-10-18 00:20:05

标签: regex bash

首要问题: 所以我有一个以。形式出现的文件名 JohnSmith14_120325_A10_6.raw 我想用正则表达式匹配它。我在构建一个工作示例时遇到了一些问题,但不幸的是,除非我掌握了基础知识,否则我的问题将无法解决。

所以我刚刚学会了管道,我学到的一件很酷的事情就是我能做到以下几点。

X=ll_paprika.sc (don't ask)
VAR=`echo $X | cut -p -f 1`
echo $VAR

给了我paprika.sc 现在,当我尝试在grep中执行管道思想时,没有任何反应。

x=ll_paprika.sc
VAR=`echo $X | grep *.sc`
echo $VAR

任何人都可以解释我做错了吗?

第二个问题: 如何使用正则表达式匹配单个下划线?

这是我最终要做的事情;

VAR=`echo $X | grep -e "^[a-bA-Z][a-bA-Z0-9]*(_){1}[0-9]*(_){1}[a-bA-Z0-9]*(_){1}[0-9](\.){1}(raw)"

因此,我的模式的基本思想是文件名必须以字母开头 然后它可以有任意数量的字母和数字,它必须有一个_分隔一系列数字和另一个_来分隔下一组数字和字符,另一个_分界下一组数字然后它必须有一个时期跟着原始。这看起来非常错误和丑陋(因为我不确定语法)。那么如何匹配文件扩展名?有人可以为ll_parpika.sc提供一个简单的例子,以便我可以弄清楚如何做我自己的正则表达式吗?

感谢。

2 个答案:

答案 0 :(得分:3)

x=ll_paprika.sc
VAR=`echo $X | grep *.sc`
echo $VAR

这不是你想要的原因是grep匹配一行并返回它。 *.sc确实匹配11_paprika.sc,因此它会返回整行并将其粘贴到$VAR

如果你想获得它的一部分,cut行可能会更好。有grep -o选项仅返回匹配部分,但为此您基本上必须放入您正在寻找的东西,此时为什么要打扰?

  

文件名必须以字母

开头

`grep -e“^ [a-zA-Z]

  

然后它可以有任何数字   其后的字母和数字

[A-ZA-Z0-9] *

  

它必须有一个_分界a   一系列数字和另一个_来划分下一组数字和   字符和另一个_来分隔下一组数字

(_ [0-9] +){3}

  

然后它必须在raw之后有一个句点。

.RAW“

答案 1 :(得分:0)

首先,使用:

VAR=`echo $X | egrep '\.sc$'`

对于第二种,您可以尝试使用此替代方法:

VAR=`echo $X | egrep '^[[:alpha:]][[:alnum:]]*_[[:digit:]]+_[[:alnum:]]+_[[:digit:]]+\.raw'`

请注意,表达式中的字符类与后面的描述不同,因为它们似乎只允许a-b在某些地方使用小写字符。这个例子允许那些地方的所有字母数字字符。