2012-05-02 12 views
0

私のディレクトリにあるファイルの名前を変更しようとしていますが、その正規表現の部分に固執しています。perlの文字列から文字と数字を削除する

最初に表示されるファイル名から特定の文字を削除します。

例1:期待_00-author--book_revision_

Author - Book (Revision)

はこれまでのところ、私はこれは良い方法ではありません最初の文字

$newfile =~ s/_/ /g; 
$newfile =~ s/^[0-9]//g; 
$newfile =~ s/^[0-9]//g; 
$newfile =~ s/^-//g; 
$newfile = ucfirst($newfile); 

をcaptialize &アンダースコアを削除するために正規表現を使用することができています。あなたが最初の文字を打つまで、すべての文字を取り除くのに助けが必要です。そして、最初の文字を打つと、「 - 」前後にスペースを追加します。また 私は2番目のヒット「 - 」。。私はそれを交換したい「(」適切なアプローチを取って上

どれ指導、ヒントやさえ提案ははるかに高く評価されて

答えて

1

だからあなたがやります新しいファイル名のすべてのコンポーネントを大文字にするか、最初のファイルのみを大文字にしたいですか?あなたの質問はその点に矛盾しています。あなたは、Linux上にある場合、あなたはおそらく、このような何かあなたのためのファイルの名前を変更するためにperlの式を取り、それを使用しますrenameコマンドを、持っていることを

注:多くの

rename 'my ($a,$b,$r);$_ = "$a - $b ($r)" 
    if ($a, $b, $r) = map { ucfirst $_ } /^_\d+-(.*?)--(.*?)_(.*?)_$/' _* 
1

あなたの命令とあなたの例ドン「トン一致。

あなたの指示によると、

s/^[^\pL]+//; # Remove everything until first letter. 
s/-/ - /;  # Replace first "-" with " - " 
s/-[^-]*\K-/(/; # Replace second "-" with "(" 

あなたの例によると、

s/^[^\pL]+//; 
s/--/ - /; 
s/_/ (/; 
s/_/)/; 
s/(?<!\pL)(\pL)/\U$1/g; 
+0

感謝を! s/-/- /; < - これで、 ' - 'を ' - 'で置き換えることはありませんか?また、ファイル名の末尾に「)」を追加するにはどうすればよいですか? – Naveen

+0

私は自分の間違いを認識しました。上記の例のようにいくつかのファイルと、00-author-book-revisionという名前のファイルがあります。どちらの場合でも、私はファイルを著者 - ブック(リビジョン)として名前を変更したいです。しかし、あなたのご意見は私をここで助けてくれました。私はこの問題を解決する方法を見つけ出すつもりです。 – Naveen

+0

@Naveen、/ gなしでは、最初のものに置き換えられます。 '$ s。= ')'; ' – ikegami

0

彼らはすべての形式は、次に試すことに従っている場合:

$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u$1 - \u$2 (\u$3),; 

おそらく最初のものを:(厳格なと警告を使用して)

my ($author, $book, $revision) = $newfiles =~ /-(.*?)--(.*?)_(.*?)_/; 

print ucfirst($author) . " - $book ($revision)\n"; 
1
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u\1 - \u\2 (\u\3),; 

私のPerlインタープリタは、これは、より良いように記述されていることを述べていますその味はセドシュです! (もちろん、両方のバージョンがちょうど同じように動作します。)(stemaによって要求されるように)

説明:置換明細書で\u${1..3}は、単に彼らの最初と1~3から捕捉基を挿入するためにPerlを指示

$filename =~ s/ 
^  # matches the start of the line 
    _\d+- # matches an underscore, one or more digits and a hypen minus 
    (.*?)-- # matches (non-greedyly) anything before two consecutive hypen-minus 
      # and captures the entire match (as the first capture group) 
    (.*?)_ # matches (non-greedyly) anything before a single underscore and 
      # captures the entire match (as the second capture group) 
    (.*?)_ # does the same as the one before (but captures the match as the 
      # third capture group obviously) 
    $  # matches the end of the line 
/\u$1 - \u$2 (\u$3)/x; 

大文字の大文字にしました。キャプチャされたグループの全体を大文字にする場合は、代わりに\Uを使用する必要があります。

Xフラグは、我々はそれがこれらを無視(正規表現で空白になるので、コメントを使用したいPerlインタープリターに指示します冗長モード、オンにする - あなたがしたい場合のスペースに一致するようにを入力する場合は、\sまたは\のいずれかを使用する必要があります)。残念ながら、*置換*仕様で空白を無視するようにPerlに指示する方法を見つけることができませんでした。これが1行に記述された理由です。

は(また、私は,から/に私のsターミネータを変更したことに注意してください - 私は冗長モードで,を使用した場合、Perlは私に吠えオン...なぜ正確にわからない。)

+0

+1は私に教えてくれますが、本当に良い答えにするために、ここで何が起こるか少し説明してください。 – stema

関連する問題