使用 perl 表达式重命名命令

使用 perl 表达式重命名命令

我可以成功使用以下命令,并且我对使用此命令进行其他组合非常有信心:

rename 's/\.htm/\.html/' *.htm

但是我想了解更多,尤其是关于s它的内容。他们说这是一个 Perl 表达式。我没有学过 Perl 编程语言,所以我不知道为什么会有这样的's/\.htm/\.html/'争论。你能告诉我它是什么吗?谢谢阅读。

答案1

一般来说rename重命名文件名根据命令的第一个参数指定的规则提供。文件名由第一个参数之后的参数提供。

示例命令中的第一个参数 ( rename 's/\.htm/\.html/' *.htm) 有毛皮部分,在本例中/是这些部分的分隔符:

s/regexp/replacement/[flags]
  1. s命令表示替换:s/<old>/<new>/。将正则表达式与模式空间的内容进行匹配。如果找到,则用替换替换匹配的字符串。

  2. 与应替换的字符串匹配的正则表达式。在当前情况下,这只是字符串.htm

    在大多数正则表达式中,点.与每个字符匹配。在这种情况下,我们想按字面意思使用点,因此我们需要使用反斜杠\(引用单个字符)来转义其特殊含义。

  3. 替换与 2 匹配的字符串/正则表达式。

  4. 当前示例中未显示的标志。例如,它可以是标志g- 将替换应用于正则表达式的所有匹配项,而不仅仅是第一个匹配项。假设我们有一个名为的文件my.htm-file.htm

    • 原始命令rename 's/\.htm/\.html/' *.htm将以这种方式重命名文件:。my.html-file.htm看看答案底部如何避免这个问题。

    • 通过添加g标志--rename 's/\.htm/\.html/g' *.htm新文件名将是:。my.html-file.html

根据文件名:*可以表示任意数量的字符(包括零个,换句话说,零个或多个字符)。shell 将扩大该范围,并将匹配的文件名作为单独的参数传递给renameSo *.htm- 将匹配当前路径中以字符串结尾的所有文件名.htm。例如,如果您有1.htm2.htm3.htm4.htm5.htm然后rename 's/\.htm/\.html/' *.htm将完全相同的参数传递给 rename 运行:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm

整个命令(rename 's/\.htm/\.html/' *.htm)可以这样理解:

rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">

让我们回到上面的例子,我们有一个名为的文件my.htm-file.htm。我们可能想更改文件名的最后一部分,也就是最后一个点后面的扩展名。为此,我们应该rename这样修改命令:

rename 's/\.htm$/\.html/' *.htm

$符号与行尾相匹配,字面意思是“向后读”。

^- 匹配模式空间开头的空字符串,即,在脱字符之后出现的内容必须出现在模式空间的开头。(阅读更多

^\(仅在正则表达式或子表达式的开头(即或之后)充当特殊字符\|。但是,可移植脚本应避免^在子表达式的开头使用它,因为 POSIX 允许^在该上下文中将其视为普通字符的实现。

$- 它与 相同^,但指的是模式空间的结尾。也仅在正则表达式或子表达式的末尾(即或$之前)充当特殊字符,并且它在子表达式末尾的使用是不可移植的。\)\|


参考:

相关内容