所以我们有一个名为这样的文件:
一些应用内-name_CT-111-一些标题-with_underscore合it_c37a9a5fc272a5c94009a61ce8dff79900ab9102_2017-07-24-03-22-19.tar.bz2
正如您所看到的,有四个部分,一个应用程序名称(dasherized),一个标题(可能包含下划线),一个哈希码,最后一个时间戳(dasherized)
它们用下划线分隔,问题是标题可能有下划线。那么我们怎么能先获得第一部分然后是最后两部分(用下划线分隔)然后剩下的是标题呢?
感谢任何帮助。
最终部分应该是:
答案 0 :(得分:2)
使用bash正则表达式可以执行此操作:
s='some-app-name_CT-111-some-title-with_underscore-in-it_c37a9a5fc272a5c94009a61ce8dff79900ab9102_2017-07-24-03-22-19.tar.bz2'
re='^([^_]+)_([a-zA-Z0-9_-]+)_([a-fA-F0-9]+)_([0-9-]+)\.'
[[ $s =~ $re ]] && printf "AppName: %s\nTitle: %s\nID: %s\nTimestamp: %s\n" \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}"
AppName: some-app-name
Title: CT-111-some-title-with_underscore-in-it
ID: c37a9a5fc272a5c94009a61ce8dff79900ab9102
Timestamp: 2017-07-24-03-22-19
答案 1 :(得分:1)
一种方式:
appname=$(echo $x | awk -F_ '{print $1}')
hcode=$(echo $x | awk -F_ '{print $(NF-1)}')
timestamp=$(echo $x | awk -F_ '{print $NF}' | grep -oE '[0-9-]{2,}')
title=$(echo $x | sed "s/.*${appname}_\(.*\)_$hcode.*/\1/")
其中x
是包含文件名
通过使用_作为分隔符获取第二个最后一列来检索哈希码。从最后一列检索时间戳,只提取数字和 - 从中提取数字。通过在appname和hashcode之间获取字符来检索标题。