2011-10-18 54 views
2

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

因此,我最近刚刚了解到管道系统,我学到的一件很酷的事情是我可以做以下事情。

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,以便我能弄清楚如何做自己的正则表达式?

谢谢。

回答

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] *

,它必须有一个_限定一个 一系列数字和另一个_来分隔下一组数字和 字符和另一个_来分隔下一组数字

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

然后它必须有一个以下的原始时间段。

.RAW”

0

为先,用途:

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

对于第二个,你可以试试这个替代方案来代替:

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

注意,从你的角色等级你的表达不同于下面的描述,因为它们似乎只允许某些地方的小写字母ab例子是放宽这些地方的所有字母数字字符。