bash - 正则表达式、捕获组和美元符号

标签 bash perl rename pcre

读一本关于 bash 的书,它介绍了正则表达式(我对它们还很陌生)并举了一个例子:

rename -n 's/(.*)(.*)/new$1$2/' *

'file1' would be renamed to 'newfile1'
'file2' would be renamed to 'newfile2'
'file3' would be renamed to 'newfile3'

不幸的是,这个例子并没有提供真正的分割。我有点了解捕获组是什么,并且 .* 是贪婪的并且会匹配所有字符,但我不确定为什么需要两个捕获组。另外,我知道 $ 代表行尾,但不确定 $1$2 在这里实际上在做什么。感谢您提供的任何见解。

尝试研究捕获组和 $ 来获取一些类似的示例并进行解释,但结果不佳。

最佳答案

你是对的。 (.*)(.*) 毫无意义。第二个 .* 将始终匹配空字符串。

例如,匹配文件

  • 第一个 .* 将匹配从位置 0 开始的 4 个字符的字符串(file),并且
  • 第二个 .* 将匹配从位置 4 开始的 0 字符串(空字符串)。

您可以将模式简化为

rename -n 's/(.*)/new$1/' *
rename -n 's/.*/new$&/' *
rename -n 's/^/new/' *
rename -n '$_ = "new$_"' *
rename -n '$_ = "new" . $_' *

关于bash - 正则表达式、捕获组和美元符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74501916/

相关文章:

linux - 对文件的前 5 个字符使用重命名命令

SVN:和 bash:如何判断是否有未提交的更改

bash - 在 bash 中按 alt + numeric 会得到 (arg [numeric]) 那是什么?

xml - 从 perl 哈希创建 XML 文件

PHP ↔ Perl 接口(interface)或绑定(bind)

Eclipse IDE - 背景色

bash - 将脚本的输出作为独立的 bash 命令运行

linux serverscript.sh 为真;做,但 sleep 然后重新检查 true

windows - 批量重命名文件并在文件名已存在时覆盖 (windows)

ruby - 我怎样才能获得为我的 Ruby 程序重命名文件的权限?