需要从文件名获取日期

需要从文件名获取日期

我有一个文件名 abcd_abcd_12302022.csv,我使用以下命令从文件名中提取了日期

cut -c 11-18

日期是 12302022。我尝试在 12/30/2022 执行以下命令,但得到 12_30_2022。

echo '20150716' | sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/'

我需要输出为 2022 年 12 月 30 日。

答案1

这与您的基本想法相同。您自己添加了_那里,所以如果您将它们更改为/它就会起作用。您只需为 sed 的运算符使用不同的分隔符即可s///。在这里,我用的是s|||

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed -E 's|(..)(..)(....)|\1/\2/\3|'
12/30/2022

或者,更便携一点:

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed  's|\(..\)\(..\)\(....\)|\1/\2/\3|'
12/30/2022

或者,您可以使用s///,但您需要/使用以下方式转义要插入的内容\/

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed -E 's/(..)(..)(....)/\1\/\2\/\3/'
12/30/2022

$ echo abcd_abcd_12302022.csv | cut -c 11-18 | sed  's/\(..\)\(..\)\(....\)/\1\/\2\/\3/'
12/30/2022

答案2

如果您在 bash shell 中的变量中有文件名,则可以使用以下命令直接在 shell 中获取所需的格式,而不是使用cut和:sedshell的参数扩展

file=abcd_abcd_12302022.csv
printf '%s\n' "${f:10:2}/${f:12:2}/${f:14:4}"

对于交互式使用或一次性事件来说,这可能并不重要,但如果您尝试从许多文件中提取时间戳,将标注保存到cut可能sed会节省一些时间。

相关内容