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