【问题标题】:How to pass captured regex group to a shell command inside perl-rename如何将捕获的正则表达式组传递给 perl-rename 中的 shell 命令
【发布时间】:2022-08-03 00:10:15
【问题描述】:

我有一组文件,我想使用 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 命令处理格式,而不是捕获日期、月份和年份等单个部分。关于如何正确执行此操作的任何想法?

  • 感谢您展示您的努力,您能否在您的问题中也发布输出样本以使其更清楚,谢谢。

标签: regex perl batch-rename


【解决方案1】:

这可能超出了单线是一个好主意的范围,但是:

$ rename 's{(_(.*?)(\.[^.]+))$}{
    my ($o,$d,$s) = ($1,$2,$3);
    $_ = `date +ok:%F -d "$d"`;
    m/ok:(.*)/ ? "_$1$s" : $o
}e' file_*
  • s{}{}e - 搜索和替换,把替换当作代码
  • 反引号中的代码是shell命令(带插值)
  • +ok:%F - 添加标记“ok:”到date 输出
  • m/ok: ... - 如果找到标记假定成功并执行替换;否则返回原值
  • date 错误将照常出现在 stderr 上;受影响的文件不会被重命名
  • 某些输入在传递到 shell 时可能不安全,应该转义;这并非完全无关紧要 - 参见例如:Perl output shell-escaped string(我发现的第一个问题)

【讨论】:

  • 回覆 ”某些输入在传递给 shell 时可能是不安全的,应该转义;这不完全是琐事", 如果这是一个问题,请将反引号替换为 use IPC::System::Simple qw( capturex ); capturex( "date", "+ok:%F", -d => $d )
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 2021-09-06
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多