簡體   English   中英

如何將捕獲的正則表達式組傳遞給 perl-rename 中的 shell 命令

[英]How to pass captured regex group to a shell command inside perl-rename

我有一組文件,我想使用 WSL Ubuntu 中提供的重命名實用程序批量重命名。 我的文件名包含以下模式,我想更正文件中的日期格式。

file_10Feb2022.pptx
file_10Mar2022.pptx
file_17Feb2022.pptx
file_17Mar2022.pptx
file_24Feb2022.pptx
file_3Feb2022.pptx
file_3Mar2022.pptx

我嘗試使用以下命令重命名

rename -n "s/_(.*)\./_`date +%F -d \1`\./g" *.pptx

我使用正則表達式捕獲日期部分,並嘗試使用日期命令(在 `` 內)正確格式化,但我無法將捕獲的正則表達式組(\1)傳遞給 shell 命令。

我有另一個文件夾,其中包含不同日期格式的后綴文件,我想捕獲它並讓 date 命令處理格式,而不是捕獲單個部分,如日期、月份和年份。 關於如何正確執行此操作的任何想法?

這可能超出了單線是一個好主意的范圍,但是:

$ rename 's{_(.*?)(\.[^.]+)$}{
    my ($d,$s) = ($1,$2);
    my $nd = `date +%F -d "$d"`;
    chomp $nd;
    $? ? $& : "_$nd$s" 
}e' file_*
  • s{}{}e - 搜索和替換,將替換視為代碼
  • 反引號中的代碼是 shell 命令(帶插值)
  • 如果$? 設置出錯,返回原值; 否則做更換
  • date錯誤將照常出現在 stderr 上; 受影響的文件不會被重命名
  • 某些輸入在傳遞給 shell 時可能不安全,應轉義; @ikegami 注意到 shell 可以完全避免。 例如:
use IPC::System::Simple qw( capturex );
capturex( "date", "+%F", "-d", $d );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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