regex - 当一个字符不是文件名中的前 8 个字符之一时,如何使用 prename 查找和替换该字符?

标签 regex shell find rename

例如,这将递归地查找所有文件名中的所有连字符并将其替换为单个空格:

find . -type f -name "*-*" -execdir prename 's/-/ /g' "{}" \;

我该如何修改它以仅替换不在文件名前 8 个字符内的连字符。

最佳答案

传递给 prename 的路径名以 ./ 为前缀,因为 -execdir 是主要的。因此,您需要保持前 个字符完整,并在路径字符串的其余部分用空格替换每个破折号,这可以通过 while 循环很容易地实现(因为 g 标志在匹配重叠时不起作用)和 PCRE 的 zero-width positive lookbehind assertion thingy * .

find -name '????????*-*' -type f -execdir prename -n '1 while s/.{10,}\K-/ /' {} +

这为每个目录至少调用一次 prename,因此,由于初始化的开销,可能会很慢。如果这是一个问题,您可以使用 -exec 而不是 -execdir,并相应地调整 Perl 表达式。以下是我的业余尝试,谨慎使用。

-exec prename -n '/(.*\/.{8})(.*)/; $_ = $1 . $2 =~ y/-/ /r' {} +

如果输出看起来不错,则删除 -n

关于regex - 当一个字符不是文件名中的前 8 个字符之一时,如何使用 prename 查找和替换该字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65517004/

相关文章:

php - MySQL 正则表达式未检测到等号

shell - 将整个文件读入 C-Shell (csh) 脚本中的变量

xcode - 如何从 shell 脚本调用 apple 脚本?

php - 将变量从 PHP 导出到 shell

linux - 找到一个.txt文件并写入其中

linux - Bash 脚本操作

javascript - 电子邮件正则表达式 - 排除指定集

javascript - 正则表达式语法错误 - 无需重复

PHP 正则表达式 : Matching Ands - & and &

javascript - 更改查找图像的功能