首要问题: 所以我有一个以。形式出现的文件名 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提供一个简单的例子,以便我可以弄清楚如何做我自己的正则表达式吗?
感谢。
答案 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在某些地方使用小写字符。这个例子允许那些地方的所有字母数字字符。