如何在 bash 脚本中获取这个子字符串?

如何在 bash 脚本中获取这个子字符串?

我正在研究 bash 脚本。

我有一个 var ,里面有一个字符串。这是字符串:

tSA_15_20161014_11-12-50

基本上格式是tSA_(id)_(year)(month)(day)_(hour)-(min)-(seg)

重要信息:

  • id 可以是 0 到 999 之间的数字
  • 年份格式为yyyy
  • 月份格式毫米
  • 日格式DD
  • 小时格式24小时

我想要得到的字符串是这样的:

20161014111250

这是yyyymmddHHMMSS

英语不是我的母语,所以如果有什么你不明白的地方请告诉我。谢谢。

答案1

bash参数扩展:

$ var='tSA_15_20161014_11-12-50'

$ var="${var#*_}"  ## Extracts the portion after first `_` i.e. 
                      new `var` will be `15_20161014_11-12-50`

$ var="${var#*_}"  ## again gets the portion after first `_`, so in this case
                      after operation `var` will contain `20161014_11-12-50`

$ echo "${var//[-_]/}"  ## Replaces all `-` and `_` from `$var` with null
20161014111250

答案2

echo "tSA_15_20161014_11-12-50" | awk -F'_' '{print $3$4}' | tr -d -

echo 存储字符串的 var

解释:

awk -F'_' '{print $3$4}'将字段分隔符更改为_并打印第三列和第四列

输出是2016101411-12-50

tr -d --从先前的结果中 删除。

答案3

给定

var='tSA_15_20161014_11-12-50'

然后

IFS=_ read -a arr <<< "${var//-/}"
printf '%s%s\n' "${arr[2]}" "${arr[3]}"
20161014111250

答案4

另一种awk方法。由于awk可以采用多个字符作为字段分隔符,因此可以一步完成:

$ awk -F'[-_]' '{print $3$4$5$6}' <<<"$var"
20161014111250

或者,在 Perl 中:

$ perl -pe 's/.+?_.+?_//; s/[-_]//g' <<<"$var"
20161014111250

或者

$ perl -F_ -ane 's/-//g for @F; print @F[2..$#F]' <<<"$var"
20161014111250

我在用着这里是字符串,但是如果您的 shell 不支持echo $var | command上述每个命令。

相关内容