Shell(Bash)参数扩展表达式

时间:2017-05-07 19:08:14

标签: bash

我有一些代码可以将文件名中的日期转换为路径。

#!/bin/bash
aFile="bla_2016-11-24_17-24.zip" # Many files, each with same format: "bla_{year}-{month}-{day}_{hour}-{minute}.zip"
aDate=${aFile#*_} # remove "bla_"
aDate=${aDate%.*} # remove ".zip"
aDate=${aDate//_/ } # replace "_" with " "
aDate=(${aDate//-/ }) # replace "-" with " " and make array
aPath="${aDate[0]}/${aDate[1]}/${aDate[2]}/${aDate[3]}/${aDate[4]}"
mkdir -p $aPath

我已经看到了这两个(12),这表明bash脚本中的嵌套参数扩展表达式是不可能的。

我想知道是否有更好的方法来实现上面的代码,更具体地说是减少代码的长度。这只是五行,所以如果不可能的话,不会有太大的刺激,但似乎我是在愚蠢地做这件事。

Python解决方案:

aFile = "bla_2016-11-24_17-24.zip"

import re
aPath = "/".join(re.split("[_-]", aFile[4:-4])) # 2016/11/24/17/24

3 个答案:

答案 0 :(得分:2)

使用bash:

aFile="bla_2016-11-24_17-24.zip"
[[ ${aFile//[_.-]//} =~ ^[^/]*/(.*)/[^/]*?$ ]] && echo "${BASH_REMATCH[1]}"

输出:

2016/11/24/17/24

答案 1 :(得分:1)

这是一个更快的Bash解决方案:

aFile="bla_2016-11-24_17-24.zip"
arr=($(echo ${aFile//[_-\.]/ }))
aPath=${arr[1]}/${arr[2]}/${arr[3]}/${arr[4]}/${arr[5]}

编辑:此解决方案仅适用于最新版本的Bash,例如Ubuntu 16.04(4.3.46)附带的版本。它失败了4.3.30(由Debian 8发布)。

答案 2 :(得分:0)

实际上,我解决了这个问题。我尝试用sed解决方案,然后意识到这是愚蠢的;我可以使用我的Python解决方案。所以对于任何想知道的人来说,这是我的:

aFile="bla_2016-11-24_17-24.zip"
aPath="$(python -c 'import sys, re; print "/".join(re.split("[_-]", sys.argv[1][4:-4]))' "$aFile")" # 2016/11/24/17/24