grep 来自 txt 文件的日期和时间以获取新变量

grep 来自 txt 文件的日期和时间以获取新变量

我需要从文本文件中提取日期(年、月、日)和时间(小时、分钟),并在以后将它们用作变量。不是家庭作业,只是想做一些对我的工作有用的事情。我是 Linux 新手。

输入:文本文件包含名为如下的文件列表:

S3G_MX_1_EFR____20100203T121015_othernumbers.zip

期望的输出是:

2010 02 03 12 10

我想将它们分别放入几个变量中:年,月,日,小时,分钟。我应该使用 grep 吗?还是sed?还是awk?读了很多书,但对大量的可能性感到压力。是否可以在字符串 S3G_MX_1_EFR____“year”之后编写像“4 个数字”这样的表达式?我不需要完整的代码,只需要一些建议,使用哪些选项/命令或从哪里开始。

答案1

使用 GNU grep 和 bash:

filename="S3G_MX_1_EFR____20100203T121015_othernumbers.zip"
timestamp=$( echo "$filename" | grep -oP '(?<=\D)\d{8}T\d{4}' )

然后

year=${timestamp:0:4};    echo $year      # => 2010
month=${timestamp:4:2};   echo $month     # => 02
day=${timestamp:6:2};     echo $day       # => 03
hour=${timestamp:9:2};    echo $hour      # => 12
minute=${timestamp:11:2}; echo $minute    # => 10

实际上,普通的 bash 就可以了(需要 4+ 版本)

regex='_([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})'
if [[ $filename =~ $regex ]]; then
    year=${BASH_REMATCH[1]}
    month=${BASH_REMATCH[2]}
    day=${BASH_REMATCH[3]}
    hour=${BASH_REMATCH[4]}
    minute=${BASH_REMATCH[5]}
    echo "$year $month $day $hour $minute"
fi
2010 02 03 12 10

答案2

你做一个替换怎么样

sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/'

(....)(扩展正则表达式语法)这样的模式与模式后面的四位数字匹配,可以在替换中使用 as\1和下面的内容。所以你的例子的结果将是

export year=2010 month=02 day=03 hour=12 minute=10

可以执行此行,例如

$(echo S3G_MX_1_EFR____20100203T121015_othernumbers.zip | sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/')

相关内容