2017-10-11 126 views
0

我想用名称中的'sr'重命名文件,用'SR'替换'sr'。这一次成功了:perl在命令行中批量重命名文件

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 

似乎单独使用时,$ _是不是空的;但在与$`,$ &和$'一起使用时它变空了。根据每个文件的最后一行,我猜想$ _在不单独使用时会暂时更改?

此外,根据a1111exe的答案,我测试:

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

,并得到这个:

3sr3sr 
sr1sr1 
sr2sr2 
+0

这不仅仅是因为你已经使用了“围绕perl代码,因此任何以$开头的东西都将被当作shell变量而不是perl吗? –

+0

但这个按预期工作: 'ls | perl -e“而(<>){终日啃食;如果(/ SR /){打印$ _}}”' 这将打印文件名 – jsjie

+0

之外,我改变了使用引号,否则$”变量将引发的问题我。试图$ \“和$ \\”,但没有用的。 – jsjie

回答

2

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

,而不是LS和命令,你可以使用Perl的内置功能水珠

并捕获您可以使用英语模块$ POSTMATCH和$预匹配前置和后置匹配

让你一个衬垫应

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

EDITED

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

Single quote

在单引号

围字符(')保留了引号内的每个字符的文本值。单引号之间可能不会出现单引号,即使前面加了反斜线。

Double quote

双引号引起的字符( '“')保留了引号中的所有字符的字面意义, '$', '`' 外, '\',并且当启用历史扩展时,'!'。

在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中,我们需要使用的,而不是单引号双引号

+0

谢谢您的回答,它的工作原理。但如果我在脚本中只使用“打印”,双引号就可以做到。你有什么主意吗? – jsjie

+0

@jsjie发布编辑。 – mkHun

0

看来你的shell环境和Perl双引号一塌糊涂。你当然可以做@mkHun建议的。另一种方法:

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

另外,如果你逃跑的 '$' 印记 '$ _',你oneliner将工作太:

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

我仍然不知道为什么,虽然..但它真的好像bash/perl插值问题。

+0

哦,我没有意识到'如果'是不需要的,直到我读你的评论。谢谢。 – jsjie

+0

我也有自己的工作方式,更新了答案。 – a1111exe