bash脚本正则表达式匹配

时间:2011-08-01 19:40:31

标签: regex bash shell awk grep

在我的bash脚本中,我有一个像

这样的文件名数组
files=( "site_hello.xml" "site_test.xml" "site_live.xml" )

我需要提取下划线和.xml扩展名之间的字符,以便我可以遍历它们以便在函数中使用。

如果这是python,我可能会使用像

这样的东西
re.match("site_(.*)\.xml")

然后提取第一个匹配的组。

不幸的是这个项目需要使用bash,所以 - 我怎样才能在bash脚本中执行此类操作?我对grep,sed或awk不是很好。

4 个答案:

答案 0 :(得分:5)

以下内容应该有效

files2=(${files[@]#site_})   #Strip the leading site_ from each element
files3=(${files2[@]%.xml})    #Strip the trailing .xml
编辑:纠正这两个拼写错误之后,似乎确实有效:)

答案 1 :(得分:2)

xbraer@NO01601 ~
$ VAR=`echo "site_hello.xml" | sed -e 's/.*_\(.*\)\.xml/\1/g'`

xbraer@NO01601 ~
$ echo $VAR
hello

xbraer@NO01601 ~
$

这会回答你的问题吗?

只需在反引号(``)

中通过sed运行变量

我不记得bash中的数组语法,但我猜你自己也知道,如果你正在编写bash;)

如果不清楚,请不要犹豫再问。 :)

答案 2 :(得分:0)

我使用cut来分割字符串。

for i in site_hello.xml site_test.xml site_live.xml; do echo $i | cut -d'.' -f1 | cut -d'_' -f2; done

这也可以在awk中完成:

for i in site_hello.xml site_test.xml site_live.xml; do echo $i | awk -F'.' '{print $1}' | awk -F'_' '{print $2}'; done

答案 3 :(得分:0)

如果你正在使用数组,你可能不应该使用bash。

更合适的例子

ls site_*.xml | sed 's/^site_//' | sed 's/\.xml$//'

这会产生由您想要的部件组成的输出。根据需要反引用或重定向。