如何从bash中用下划线分隔的字符串中提取第一个和最后两个部分?

时间:2017-07-24 04:27:47

标签: regex string bash

所以我们有一个名为这样的文件:

  

一些应用内-name_CT-111-一些标题-with_underscore合it_c37a9a5fc272a5c94009a61ce8dff79900ab9102_2017-07-24-03-22-19.tar.bz2

正如您所看到的,有四个部分,一个应用程序名称(dasherized),一个标题(可能包含下划线),一个哈希码,最后一个时间戳(dasherized)

它们用下划线分隔,问题是标题可能有下划线。那么我们怎么能先获得第一部分然后是最后两部分(用下划线分隔)然后剩下的是标题呢?

感谢任何帮助。

最终部分应该是:

  • 应用程序名称:some-app-name
  • 标题:CT-111-some-title-with_underscore-in-it
  • ID:c37a9a5fc272a5c94009a61ce8dff79900ab9102
  • 时间戳:2017-07-24-03-22-19

2 个答案:

答案 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之间获取字符来检索标题。