bash脚本regex匹配



在我的bash脚本中,我有一个类似的文件名数组

files=( "site_hello.xml" "site_test.xml" "site_live.xml" )

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

如果这是python,我可能会使用类似的东西

re.match("site_(.*).xml")

然后提取第一匹配组。

不幸的是,这个项目需要在bash中,所以——我如何在bash脚本中做这种事情?我不太擅长grep、sed或awk。

以下内容应该能在中工作

files2=(${files[@]#site_})   #Strip the leading site_ from each element
files3=(${files2[@]%.xml})    #Strip the trailing .xml

编辑:在纠正了这两个拼写错误后,它似乎确实有效:(

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

这能回答你的问题吗?

只需在回溯标记(``(中通过sed运行变量

我不记得bash中的数组语法,但如果您正在编程bash,我想您自己也很清楚;(

如果不清楚,请毫不犹豫地再次询问

我会使用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

如果您使用的是数组,那么您可能不应该使用bash。

是一个更合适的例子

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

这将产生由所需零件组成的输出。根据需要勾选或重定向。

最新更新