用 perl 表达式重命名命令

Smi*_*ile 8 rename

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

rename 's/\.htm/\.html/' *.htm
Run Code Online (Sandbox Code Playgroud)

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

pa4*_*080 11

通常根据指定为命令的第一个参数的规则rename重命名提供的文件名。在该文件名是由下面的第一个参数提供。

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

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

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

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

  3. 替换匹配到 2 的 sting/regexp。

  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 将扩展该 glob,并将匹配的文件名作为单独的参数传递给renameSo-*.htm将匹配当前路径中以字符串结尾的所有文件名.htm。例如,如果你有1.htm, 2.htm, 3.htm, 4.htm,5.htm然后rename 's/\.htm/\.html/' *.htm传递完全相同的参数来重命名为运行:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
Run Code Online (Sandbox Code Playgroud)

整个命令 ( 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">
Run Code Online (Sandbox Code Playgroud)

当我们有一个名为my.htm-file.htm. 可能我们想在最后一个点之后更改文件名的最后一部分,即扩展名。为此,我们应该rename以这种方式修改命令:

rename 's/\.htm$/\.html/' *.htm
Run Code Online (Sandbox Code Playgroud)

$标配到行的末尾,字面意思是“阅读落后”。

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

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

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


参考:

  • *“第二个参数,即文件名匹配表达式”* 不,`rename` 永远不会看到`*.htm`。在运行 `rename` 之前,shell [expands that glob](https://www.gnu.org/software/bash/manual/bash.html#Filename-Expansion),并将匹配的文件名作为 *separate* 传递`rename` 的参数。如果你有`1.htm`、`2.htm`、`3.htm`、`4.htm`和`5.htm`,那么`rename 's/\.htm/\.html/' *。 htm` 将*完全* 相同的参数传递给 `rename`,与运行 `rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm` 相同。您是否愿意编辑——或接受编辑——来纠正它?否则这个答案很好。 (2认同)
  • @EliahKagan:感谢您的留言!我进行了编辑。 (2认同)