我想用' 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
答案 0 :(得分:2)
首先在linux中我们应该使用单引号而不是双引号。
而不是ls命令你可以使用perl内置函数glob
要捕捉前后匹配,你可以使用英文模块中的$ POSTMATCH和$ PREMATCH
所以你的一个班轮应该是
perl -MEnglish -e 'while(<*>){chomp;if(/sr/){rename $_,$PREMATCH."SR".$POSTMATCH}}'
<强> EDITED 强>
单引号和双引号不是关于Perl这是关于shell的。
用单引号括起字符(&#39;)会保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
用双引号括起字符('&#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插值问题。