在我的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$//'
这将产生由所需零件组成的输出。根据需要勾选或重定向。