我想通过提取文件名的一部分来创建目录名。这里有些例子:
server.log.2016-03-20-14
→20160320
server-2016-03-17-13-16-Restart.log
→20160317
我正在使用 HP-UX。
答案1
你可以使用 awk 来实现。
1)
echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'
2)
echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'
答案2
您可以使用 sed 将文件名传递给正则表达式检查:
echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\2\3/g'
echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log/\1\2\3/g'
如果您需要更严格的正则表达式,例如可以使用正则表达式描述月份
0[0-9]\|1[12]
日子是
0[1-9]\|[12][0-9]\|3[01]
答案3
您可以使用 shell 的字符串操作结构来完成此操作。这需要 POSIX shell,因此如果您运行的是旧版本的 HP-UX,您可能需要调用 POSIX shell(例如 ksh)而不是 Bourne shell。
您没有完全指定如何解析日期。我假设????-??-??
每个??
数字的第一个匹配项都是您想要的日期。
p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"
不是最易读的代码,但它可以工作。