簡體   English   中英

使用 date 命令在 bash 腳本中的 sed 命令中重新格式化日期

[英]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.pdf2020-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM