perl批处理命令行重命名文件

时间:2017-10-11 13:29:42

标签: perl

我想用' sr'重命名文件。在他们的名字中,取代' sr'与' SR'。这个成功了:

ls | perl -e 'while(<>){chomp;if(/(.*)sr(.*)/){rename $_,$1."SR".$2}}'

但是这个失败了:

ls | perl -e "while(<>){chomp;if(/sr/){rename $_,$\`.'SR'.($')}}"

出现此错误消息:

Not enough arguments for rename at -e line 1, near "rename ,"`
Execution of -e aborted due to compilation errors.

似乎$ _已成为一个空字符串,但我不太明白为什么。谢谢你的任何解释。

现在引用是一个有趣的问题,这是我的测试:

ls | perl -e "while(<>){chomp;if(/sr/){print $_;print\"\n\";print $\`,$&,($');print \"\n\";print $_,$\`,$&,($');print\"\n\";print $_;print\"\n\"}}"

输出:

3sr
3sr
3sr
3sr
sr1
sr1
sr1
sr1
sr2
sr2
sr2
sr2

似乎单独使用时,$ _不为空;但与$`,$&amp;同时使用时它会变空和$&#39;。根据每个文件的最后一行,我猜$ _不是单独使用时暂时改变了吗?

此外,根据a1111exe的回答,我测试了这个:

ls | perl -e "while(<>){chomp;if(/sr/){print \$_,$\`,$&,($');print \"\n\"}}"

得到了这个:

3sr3sr
sr1sr1
sr2sr2

2 个答案:

答案 0 :(得分:2)

首先在linux中我们应该使用单引号而不是双引号。

而不是ls命令你可以使用perl内置函数glob

要捕捉前后匹配,你可以使用英文模块中的$ POSTMATCH和$ PREMATCH

所以你的一个班轮应该是

perl -MEnglish -e 'while(<*>){chomp;if(/sr/){rename $_,$PREMATCH."SR".$POSTMATCH}}'

<强> EDITED

单引号和双引号不是关于Perl这是关于shell的。

Single quote

  
    

用单引号括起字符(&#39;)会保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。

  

Double quote

  
    

用双引号括起字符('&#34;')会保留引号内所有字符的字面值,但'$','`','\'以及启用历史记录扩展时除外,'!'。

  

在shell脚本中,我们使用$访问shell变量前缀,因此在双引号内使用$时,它正在查找shell变量而不是Perl变量。例如,您可以在终端中运行以下行,

m=4; perl -e "print $m;"

下面

m=4; perl -e "print $m;"
^                   ^ 
|                   Accessing shell variable
Assigning shell variable

输出为4。因为m是shell变量,所以您正在访问Perl脚本中的shell变量。

在Windows中,我们需要使用双引号而不是单引号

答案 1 :(得分:0)

看起来你的shell环境和Perl之间出现双引号混乱。你当然可以做@mkHun建议的事情。另一种方式:

idx

另外,如果你在'$ _'中逃避'$'sigil,你的oneliner也会起作用:

ls | perl -e 'while(<>){chomp;($new=$_)=~s/sr/SR/g;rename $_,$new}'

我仍然不明白为什么..但它看起来真的像bash / perl插值问题。