2017-10-11 12 views
0

'sr'を 'SR'に置き換えて、名前に 'sr'というファイル名を変更します。 「perlバッチファイル名をコマンドラインで変更します

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(.*)/){rename $_,$1."SR".$2}}' 

をしかし、この1つは失敗しました:この1は成功しました

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

をこのエラーメッセージを表示してなぜか分かりません。説明をありがとう。

は今、引用符は興味深い問題となっている、これは私のテストで:

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\"}}" 

をし、この得た:我々は、単一引用符の代わりに二重引用符を使用する必要があり、Linuxで最初に

3sr3sr 
sr1sr1 
sr2sr2 
+0

"Perlコードの周りを使用しているため、$で始まるものはperlよりむしろシェル変数として扱われるでしょうか? –

+0

しかしこれは期待通りに動作します: ' ls | perlファイル名を – jsjie

+0

と出力します。それ以外の場合は、$変数が問題を引き起こすため、引用符の使用を変更しました。 $ \ 'と$ \\は試してみましたが使用しません。 – jsjie

答えて

2

を。

、代わりにLSの

あなたはperlの作り付けの機能グロブ

を使用することができますし、英語モジュールからの$ POSTMATCHと$ PREMATCHを使用することができ、事前と事後の一致をキャプチャするコマンド

ので、あなたの1つのライナーはする必要があります

編集

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

一重引用符と二重引用符はPerlに関するものではありません。これはシェルに関するものです。単一引用符で文字を囲むと

Single quote

は( ')引用符内の各文字のリテラル値を保持します。たとえバックスラッシュが前に置かれていても、一重引用符間に一重引用符はできません。二重引用符で文字を囲むと

Double quote

( '"') '`'、 '$' を除いて、全ての文字のリテラル値を保持し、 '\'、履歴展開が有効な場合は '!'シェルスクリプトで

我々はそれがシェル変数ではないPerlの変数を探している二重引用符内$を使用しているので、$とシェル変数の接頭辞にアクセスしています。たとえば、あなたのターミナルで次の行を実行することができ、

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

ここ

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

出力が4です。 mはシェル変数であるため、Perlスクリプト内のシェル変数にアクセスしています。

とWindowsで、我々は代わりに単一引用符の二重引用符を使用する必要が

+0

あなたの答えをありがとう、それは動作します。しかし、スクリプトで "print"だけを使用すると二重引用符が使用されます。あなたは何か考えていますか? – jsjie

+0

@jsjie投稿編集されています。 – mkHun

0

それはあなたのシェル環境と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

関連する問題