【问题标题】:regexp for renaming multiple files using 'rename.pl'使用“rename.pl”重命名多个文件的正则表达式
【发布时间】:2017-08-24 10:38:14
【问题描述】:

我正在使用rename.pl 重命名多个文件。我无法提出正确的正则表达式。我的文件名格式为:

nn.some.title.string.ext

我只想更改第一个 '.'到 ' - '。我认为这会起作用,但它没有。

s/\.?/ - /

有人可以帮我解决这个问题吗? TIA。

【问题讨论】:

  • 你为什么使用?量词?它使模式可选。去掉它。 s/\./ - / 应该可以工作。
  • s/([^\.]*)\./$1-/ 试试这个
  • s/\./ - / 没有按预期工作吗?
  • @WtRiker:你为什么需要组和反向引用?如果你不使用/g修饰符,你只会在输入中找到一个匹配。
  • 不要使用那个程序。这是业余代码,不恰当且不必要地使用eval

标签: regex linux perl rename


【解决方案1】:

试试这个简单的正则表达式模式。

my $str = "nn.some.title.string.ext";

$str=~s/^([^\.]*)\./$1-/i;
or
$str=~s/\./-/;

#^([^\.]*)       Starting point upto the first dot

print $str;

【讨论】:

  • 我猜你需要 /i 修饰符以防遇到小写句号?
  • 哈哈哈...只是我从上一行复制了正则表达式。谢谢。
【解决方案2】:

您可能希望确保第一点不是最后一点。我的意思是,如果您有任何机会拥有 nn_some_title_string.ext 文件名,则脚本不会更改最后一个点。

$fileName = "nn.some.title.string.ext";

$fileName =~s/\.(?=\w+\.\w+)/-/;

print "FileName: " . $fileName ."\n";

【讨论】:

    【解决方案3】:

    \.? 可以匹配零字符序列,因此s/\.?/ - / 替换输入开头的点或空字符串。

    "abc.def.ghi" ⇒  " - abc.def.ghi"
    ".abc"        ⇒  " - abc"
    

    要替换第一个.,您可以使用以下内容:

    s/\./ - /
    

    "abc.def.ghi" ⇒ "abc - def.ghi"
    

    要替换所有.,但前导或扩展中的一个,您可以使用以下内容:

    s/(?!^)\.(?!\w+\z)/ - /g
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2017-08-10
      • 2021-11-04
      • 2011-12-09
      • 2018-08-22
      • 2011-04-28
      相关资源
      最近更新 更多