我有一个文件名 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
和:sed
shell的参数扩展:
file=abcd_abcd_12302022.csv
printf '%s\n' "${f:10:2}/${f:12:2}/${f:14:4}"
对于交互式使用或一次性事件来说,这可能并不重要,但如果您尝试从许多文件中提取时间戳,将标注保存到cut
可能sed
会节省一些时间。