2012-02-23 3 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 -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

를 수행, 현재 디렉토리에있는 모든 * .c 인 파일의 이름을 변경

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

재귀 적으로 모든 하위 디렉토리를 통해이 작업을 수행하려면 작성하려면 기존 파일은 * .c 파일은 소문자로 바뀝니다.

#!/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

이 스크립트는 한 파일에 유용하지만 대개 .c를 갖는 문자열을 포함하는 수백 개의 파일이 있습니다. 나는 이러한 모든 문자열을 소문자로 대체해야합니다. 감사합니다. – user1225606

+0

위의 코드를 100s 파일로 수정 하시겠습니까? 그렇다면 모든 100s 파일이 같은 디렉토리에 있다는 것을 알려주십시오. 새 파일을 만들지 않고 파일 내용을 위의 요구 사항으로 바꾸시겠습니까? – run

+0

예 .. 단일 디렉토리의 모든 파일을 수정하고 싶습니다. – 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 -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

관련 문제