在我的bash脚本中,我有一个像
这样的文件名数组files=( "site_hello.xml" "site_test.xml" "site_live.xml" )
我需要提取下划线和.xml扩展名之间的字符,以便我可以遍历它们以便在函数中使用。
如果这是python,我可能会使用像
这样的东西re.match("site_(.*)\.xml")
然后提取第一个匹配的组。
不幸的是这个项目需要使用bash,所以 - 我怎样才能在bash脚本中执行此类操作?我对grep,sed或awk不是很好。
答案 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$//'
这会产生由您想要的部件组成的输出。根据需要反引用或重定向。