我可以成功使用以下命令,并且我对使用此命令进行其他组合非常有信心:
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)
该s命令表示替换:s/<old>/<new>/。将正则表达式与模式空间的内容进行匹配。如果找到,用替换替换匹配的字符串。
与应替换的字符串匹配的正则表达式。在当前情况下,这只是 string .htm。
在大多数正则表达式中,点.匹配每个字符。在这种情况下,我们想按字面意思使用点,因此我们需要使用反斜杠\(引用单个字符)来转义它的特殊含义。
替换匹配到 2 的 sting/regexp。
当前示例中未显示的标志。例如,它可能是标志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\)或\|)充当特殊字符,并且它在子表达式末尾的使用不可移植。
参考: