2012-02-23 12 views
0

Aaa*.cを含む文字列を検索し、再帰的にファイル内のaaa*.cに置き換える必要があります。特定の文字列パターンを検索して再帰的に小文字に置き換えます

私は特定のパターンが含まれているディレクトリ内のファイルの数百を持っている(この.Cがあまりにも文字列に拡張または文字列の間にあることができる)と私は小文字で

を、このような文字列を置換する必要が私はawk '{print tolower($ 0)またはtrを使用しようとしていますが、特定のパターンを検索してここで適用できませんでした。

ありがとうございました

+0

あなたは*で何を意味するか説明してください」この.Cは、間の文字列にまたはで拡張することができ文字列も "* – Borodin

答えて

1

これにはsedを使用できます。

(echo AaA.c; echo bGb) | sed '/\.c$/y/A-Z/a-z/' 

出力:

aaa.c 
bGb 
5

あなたがタグのリストにPerlを入れているので、ここではPerlのソリューションは

ある
perl -pe "s/(\S+\.c)\b/\L$1/g" myfile > newfile 

あなたはその場でファイルを編集したい場合(と元を失う)

perl -pie "s/(\S+\.c)\b/\L$1/g" myfile 

スクリプトは新しいファイルを作成する場合は、ここで、この

perl -MFile::Find -e "find sub{ rename $_, qq(\L$_) if /\.c$/i }, '.'" 
+0

ありがとうが、まだ少し混乱しています。 パターンが.cで終わる文字列を含むディレクトリ内のすべてのファイルを変更したい(ABCを含むすべての文字列がabcを含む文字列に置き換えられているようにすることができます) – user1225606

+0

ああ、私は思っています! *すべての* .cファイルの名前を小文字に変更したいですか?私はそれに応じて私の答えを変更しました。 – Borodin

+0

...あなたは*再帰的に言及しています*。それは、すべてのサブディレクトリで同じことをしたいということですか?私は再び答えに加えました。 – Borodin

0

を行い、すべてのサブディレクトリを再帰的にこれを行うには

perl -e "rename $_, qq(\L$_) for glob '*.c'" 

を書き、現在のディレクトリ内のすべての* .cファイルの名前を変更するには既存のファイルでは* .cのファイルは小文字のletetersに置き換えられます。

#!/usr/bin/perl 
use strict; 
my $file='originalfile.txt'; 
open(CMD, "<$file") or die "$!"; 

my $str; 
while(<CMD>) { 

    if($_ =~ /\.c$/){ 

     $str.=lc($_); 
    } else { 
     $str.=$_; 
    } 

} 
print $str; 
close(CMD); 
my $file2='newfile.txt'; 
open(CMD, ">$file2") or die "$!"; 
print CMD $str; 
close(CMD); 

あなたのニーズに上記が正しいかどうかを教えてください。

+0

このスクリプトは1つのファイルに役立ちますが、共通の.cを持つ文字列を含む数百のファイルがあります。私はすべてのそのような文字列を小文字に置き換える必要があります。 ありがとうございます – user1225606

+0

上記のコードを100sのファイルに変更したいのですか?もしあれば、100sのファイルがすべて同じディレクトリに残っていることを教えてください。新しいファイルを作成せずにファイルの内容を上記の要件に置き換えたいとしますか? – run

+0

はい。すべてのファイルを1つのディレクトリに変更したいと思います。 – user1225606

0
echo "Aa.c bB.b CC.c" | perl -ne 's/\b(\w+)(?=\.c)\b/lc $1/eg;print;' 
0

これはあなたのために働くかもしれません:あなたは、ファイルの名前を変更したいよう

echo -e "Aa.c bB.b CC.c\ndD.d EEE.ca Ff_gG.c" | sed 's/\S*\.c\>/\L&/g' 
aa.c bB.b cc.c 
dD.d EEE.ca ff_gg.c 
0

それはほとんど聞こえます。その場合は、次のように、あなたがそれを行うことができます:

find -name 'Aaa*.c' -type f | perl -nle' 
    my $o=$_; my $n=lc($_); 
    next if $n eq $o; 
    if (-e $n) { 
     warn "$o -> $n: Rename failed: Already exists\n"; 
    } elsif (!rename($o, $n)) { 
     warn "$o -> $n: Rename failed: $!\n"; 
    } 
' 

それとも、Perlを使用しては、

perl -MFile::Find::Rule -e' 
    for my $o (
     File::Find::Rule->name("Aaa*.c")->file->in(".") 
    ) { 
     my $n=lc($_); 
     next if $n eq $o; 
     if (-e $n) { 
     warn "$o -> $n: Rename failed: Already exists\n"; 
     } elsif (!rename($o, $n)) { 
     warn "$o -> $n: Rename failed: $!\n"; 
     } 
    } 
' 
+1

誤って複数のファイルの名前を同じ名前に変更して、多くのファイルを失ってしまいました。私は '-e $ n'チェックが最も重要であると考えます。 – ikegami

関連する問題