[英]Use date command to reformat date within sed command in bash script
我正在嘗試將文件名中的一系列 pdf 文件重命名為: The New Town Cryer - 01 Oct 2020.pdf
2020-10-01_-_The_New_Town_Cryer.pdf
到2020-10-01_-_The_New_Town_Cryer.pdf
。 我已經編寫了一個使用sed
來完成此操作的 bash 腳本,但是我無法弄清楚如何使用date
命令將日期從當前的三個字母月份格式轉換。 到目前為止,這是我的腳本行(之前的newname
變量是The New Town Cryer - 01 Oct 2020 pdf
:
newname="$(echo "$newname" | sed -re 's/^(.*) - (.*) ([^ ]+)$/echo "$(date -d "\2" "+%Y-%m-%d")-\1".\3/')"
這一行的輸出是echo "$(date -d"01 Oct 2020" "+%Y-%m-%d")-The New Town Cryer".pdf
,我希望它是2020-10-01-The New Town Cryer.pdf
誰能告訴我我哪里出錯了? 謝謝!
編輯:這里要澄清的是到目前為止我的整個腳本,因為我的片段似乎不清楚。 文件名的原始格式是The New Town Cryer - No. 1,032 [01 Oct 2020].pdf
,我正在嘗試將其轉換為2020-10-01_The_New_Town_Cryer.pdf
格式。
#!/bin/bash
find "$1" "*.pdf" -type f -printf "%f\n" | while IFS= read -r f ; do #find all pdfs
name=$f
newname="$(echo "$name" | sed -re 's/\./ /g')" # replace .s with spaces to allow 'date'-command to parse the date
newname="$(echo "$newname" | sed -re 's/\[/!/g')" # replace [s with spaces to allow 'date'-command to parse the date
newname="$(echo "$newname" | sed -re 's/\]/!/g')" # replace [s with spaces to allow 'date'-command to parse the date
newname="$(echo "$newname" | sed -re 's/(.*) - (.*) (!.*!)/\1\ - \3/')" # remove issue number
newname="$(echo "$newname" | sed -re 's/\!//g')" # replace !s with spaces to allow 'date'-command to parse the date
newname="$(echo "$newname" | sed -re 's/^(.*) - (.*) ([^ ]+)$/echo "$(date -d "\2" "+%Y-%m-%d")-\1".\3/')" # reorder the date and name, split at '-', keep the file extension, prepare for date conversion
newname="$(echo "$newname" | bash )"
newname="$(echo "$newname" | sed -re 's/ /./g')" # replace remaining spaces with .
mv "$name" "$newname"
done
使用 bash 的本機正則表達式支持而不是嘗試(ab)在此處使用sed
使代碼 - 雖然可能更長 - 更易於閱讀。 作為解決方案,您可以在https://ideone.com/Suw9Ow看到工作:
oldname='The New Town Cryer - 01 Oct 2020.pdf'
date_re='(^.*) - ([[:digit:]]{2}) ([[:alpha:]]+) ([[:digit:]]{4})(.*)'
if [[ $oldname =~ $date_re ]]; then
basename=${BASH_REMATCH[1]}
day=${BASH_REMATCH[2]}
month=${BASH_REMATCH[3]}
year=${BASH_REMATCH[4]}
ext=${BASH_REMATCH[5]}
new_date=$(date -d "${day} ${month} ${year}" +%Y-%m-%d)
newname="${new_date} - ${basename}${ext}"
echo "Old name: $oldname"
echo "New name: $newname"
fi
這可能對你有用(GNU sed):
sed -E 's/(.*) - (.*)\.(.*)/echo $(date -d "\2" "+%Y-%m-%d")-\1.\3/e' file
匹配文件名,然后使用e
標志來評估 echo 命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.