regex - 当格式不固定时,如何从 shell 变量的末尾提取时间戳?

标签 regex perl shell awk

我正在尝试从 shell 变量的末尾提取时间戳,如下所示:

Input=AEXP_CSTONE_EU_prpbdp_sourcefile_yyyymmddhhmmss.txt
TimeStamp=`echo $Input | awk -F"_" '{print $6}'`

这适用于这种特殊情况,但字符串的格式可以更改。例如,它也可以是:

Input=AEXP_CSTONE_EU_prpbdp_sourcefile_prospects_yyyymmddhhmmss.txt

该变量始终以 yyyymmddhhmmss.txt 结尾。如何一致地提取时间戳?

最佳答案

给定:

$ echo $Input
AEXP_CSTONE_EU_prpbdp_sourcefile_prospects_20151116141111.txt

您可以使用sed:

$ echo $Input | sed -n 's|.*_\([0-9]\{14\}\)\.txt|\1|p' 
20151116141111

或嵌套 grep:

$ echo $Input | grep -Eo '_[0-9]{14}\.txt' | grep -Eo '[0-9]{14}'
20151116141111

awk:

$ echo $Input | awk -F_ '{split($NF, a, "."); print a[1]}'
20151116141111

Perl

$ echo $Input | perl -ne 'print $1 if /_(\d{14})\.txt/'
20151116141111

剪切和旋转:

$ echo $Input | rev | cut -d'_' -f 1 | rev | cut -d'.' -f 1
20151116141111

bash :

$ last=${Input##*_}
$ echo $last
20151116141111.txt
$ ts=${last%.*}
$ echo $ts
20151116141111

总而言之,有很多方法......


如果您不想丢失 .txt 部分,则更简单:

$ echo $Input | sed -n 's|.*_\([0-9]\{14\}\.txt\)|\1|p'
20151116141111.txt
$ echo $Input | grep -Eo '[0-9]{14}\.txt$'
20151116141111.txt
$ echo $Input | awk -F_ '{print $NF}'
20151116141111.txt
$ echo $Input | perl -ne 'print $1 if /_(\d{14}\.txt)/'
20151116141111.txt
$ echo $Input | rev | cut -d'_' -f 1 | rev
20151116141111.txt
$ last=${Input##*_}
$ echo $last
20151116141111.txt

关于regex - 当格式不固定时,如何从 shell 变量的末尾提取时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744802/

相关文章:

mysql - 在 MySQL 命令行中,如何防止数据值中出现的新行在 SELECT 期间导致控制台输出中出现新行?

python - 调用包含 "echo"和 "|"的命令行

javascript - 使用 js Regex 在 URL 中查找特定静态文件

perl - 两次调用 Perl GetOptions 无法按预期工作

linux - csh 内联数学

mysql - 指定连接Mysql的源IP

perl - 每个 Perl 黑客都应该了解 perl -ne 什么?

python - 如何在遇到 'character' 时强制正则表达式停止并再次从头开始

javascript - 从字符串中提取电子邮件地址

java - 如何使用模式中的变量来替换所有除外?