Regex bash脚本正则表达式匹配

Regex bash脚本正则表达式匹配,regex,bash,shell,awk,grep,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不是很好 xbraer@NO01601 ~

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

files=( "site_hello.xml" "site_test.xml" "site_live.xml" )
我需要提取下划线和.xml扩展名之间的字符,以便在函数中循环使用它们

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

re.match("site_(.*)\.xml")
然后提取第一个匹配组

不幸的是,这个项目需要在bash中,所以--我如何在bash脚本中完成这种事情?我对grep、sed或awk不是很好

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

xbraer@NO01601 ~
$ echo $VAR
hello

xbraer@NO01601 ~
$
这回答了你的问题吗

只需在backticks(``)中通过sed运行变量

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


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

像下面这样的方法应该可以奏效

files2=(${files[@]#site_})   #Strip the leading site_ from each element
files3=(${files2[@]%.xml})    #Strip the trailing .xml
编辑:在更正了这两个输入错误后,它似乎确实起作用了:)

我会用它来拆分字符串

for i in site_hello.xml site_test.xml site_live.xml; do echo $i | cut -d'.' -f1 | cut -d'_' -f2; done
这也可以通过以下方式完成:


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

一个更合适的例子是

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

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

顺便说一句,这些替换选项都记录在这里:
ls site_*.xml | sed 's/^site_//' | sed 's/\.xml$//'