2010-02-22 4 views
6

클래스를 전역 네임 스페이스에서 특정 네임 스페이스로 이동했습니다. 클래스 이름도 변경했습니다. 이 클래스를 사용하는 모든 소스 파일을 새로운 형식으로 변환하려고합니다. Cygwin에서 sed 파일을 사용하거나 perl 스크립트를 실행하여 bash 스크립트를 생각하고있었습니다. bash 스크립트에 문제가 있습니다. 다음, C++ 클래스 이름을 변경하기위한 스크립트

  • 파일이 오래된 클래스 이름이 포함 된 경우 : 재귀

      각 소스 파일에 대해
    1. , * cpp를하고 * .HPP을, 다음은

      내가 수행하기 위해 노력하고있어 프로세스의 파일을 변환하십시오.
    2. 로 끝납니다.

    Bash 내 문제는 파일에 이전 클래스 이름이 들어 있는지 감지하고 있습니다. 나는 각 클래스 이름에 대해 하나의 grep 문의 생각 :

    for f in `find . -iname \*.[ch]pp`; 
    do 
        if [ grep "Field_Blob_Medium" $f -eq 0 || grep "Field_Boolean" ]; then 
         sed -f conversion.sed $f 
        fi 
    done 
    

    문제로 문은,이 구문을 사용하는 경우 하나의 명령 Bash 될 수 있다는 것입니다 :

    if grep "Field_Unsigned_Short" $f; 
    

    그래서 난 할 수 없어 논리합은 grep입니다.

    나는 중첩 루프를 수행 할 수 있습니다,하지만 난 방법을 breakBash 중 루프 모른다 :

    OLD_CLASS_NAMES="Field_Blob_Medium Field_Boolean Field_Unsigned_Int" 
    for f in `find . -iname \*.[ch]pp`; 
    do 
        for c_name in $OLD_CLASS_NAMES; 
        do 
        if grep $c_name $f then 
         sed -f convert.sed $f # <-- Need to break out of inner loop after this execution. 
        fi 
        done 
    done 
    

    그래서 내가 포함하는 모든 소스 파일을 처리하는 방법에 대한 제안을 찾고 있어요를 오래된 클래스 이름을 새 클래스로 변환합니다. Cygwin Bash 스크립트 예제가 선호되지만 Perl 스크립트도 사용할 수 있습니다. 또한 스크립트는 변환 된 내용을 new 파일에 쓰기 전에 원본 원본 파일의 백업 복사본을 만들어야합니다.

    Windows XP 및 Windows Vista에서 Cygwin을 실행 중입니다.

  • +1

    캔트 grep을 여러 regexp와 함께 사용 하시겠습니까? grep -e "Field_Blob_Medium"-e "Field_Boolean"-e "Field_Unsigned_Int"... ? – lollinus

    +1

    모든 처리 된 파일의 백업을 만들 수 있습니다 : sed -i.bak -f convert.sed $ f – lollinus

    +0

    'break'는'for' 루프에서 빠져 나오고'if prog || prog || prog' (또는 정규 표현식을 사용하는 것이 좋습니다.) 'for '와'find'는 일반적으로 파일 이름에 공백이있을 때 실패하기 때문에 나쁜 생각입니다. 'find'를'while'으로 파이프하는 것이 더 좋습니다. –

    답변

    2

    멀리 펄 부끄러워하지 마십시오 my2c가 true 인 경우에만 작동합니다!

    #! /usr/bin/perl -i.bak 
    
    use warnings; 
    use strict; 
    
    my $old = join "|" => qw(
        Field_Blob_Medium 
        Field_Boolean 
        Field_Unsigned_Int 
    ); 
    
    chomp(@ARGV = `find . -iname \*.[ch]pp -print0 | 
           xargs -0 grep -lE '($old)'`); 
    
    unless (@ARGV) { 
        warn "$0: nothing to do!\n"; 
        exit 0; 
    } 
    
    while (<>) { 
        s[Field_Blob_Medium] [my::ns::MediumBlob]g || 
        s[Field_Boolean]  [my::ns::Bool]g  || 
        s[Field_Unsigned_Int] [my::ns::UInt]g; 
    
        print; 
    } 
    

    -i 스위치는 내부 편집 용입니다. 자동으로 백업을 생성하고 변환 된 결과를 원래 위치에 씁니다.

    설정 @ARGV은 마치 이전 클래스 이름을 포함하는 파일이 *.cpp*.hpp 인 프로그램을 호출 한 것처럼 만듭니다. -Egrep으로 변경하면 확장 정규 표현식을 사용할 수 있으므로 이스케이프 처리되지 않은 (, )|은 메타 문자입니다.

    히트가없는 경우 (, 즉, @ARGV이 비어있는 경우) 아무 것도 없습니다.

    그렇지 않으면 이전 이름이있는 각 파일의 행 (Perl이 처리하는 기능)에 따라 Field_Blob_Mediummy::ns::MediumBlob 등으로 이름을 바꾸어보십시오. 이러한 대체 시도는 첫 번째 성공 이후 중단되므로 두 개의 다른 이전 이름이 포함 된 행은 대체되고 다른 행은 동일하게 유지됩니다.

    대개 대체 연산자는 s///으로 작성되지만 위와 같이 대괄호 구분 기호를 사용할 수 있습니다. 나는 새로운 이름을 왼쪽으로 정당화하기 위해 그렇게했다.

    물론 이것은 실제 대체품을위한 대용품입니다.

    마지막으로 print 가능성있는 수정 된 행입니다. -i이 (가) 업데이트 된 소스 파일에 쓰기 때문에 가능합니다.

    0

    grep에 regex 옵션을 사용하면 검색을보다 유연하게 할 수 있습니다. 귀하의 예를 당 :

    if [ grep "Field_Blob_Medium" $f -eq 0 || grep "Field_Boolean" ]; 
    

    이 될 수

    당신은 함께 그 문자열 수
    if [ grep -E "(Field_Blob_Medium|Field_Boolean)" ... ]; 
    

    | 마음 콘텐츠의 ''.

    게다가 당신이 경우에 당신이 그 루프를 단순화 할 ... 당신의 greps

    find . -name "*.hpp" or -name "*.cpp" | xargs grep -E ... 
    

    로 발견 병합 할 수 있습니다.

    1

    내 리눅스에서 작동합니다.

    #!/bin/bash 
    OLD_NAMES="(EField_Blob_Medium|Field_Boolean|Field_Unsigned_Int)" 
    
    find "$1" -name "*.hpp" -o -name "*.cpp" -print0 | \ 
        xargs -0 --replace grep -E "${OLD_NAMES}" {} && sed -i.save -f convert.sed {} 
    

    중요한 것은 :

    • xargs를의 -0으로 찾을 수의 -print0 옵션을 공백으로 파일을 관리 그것은 다른 사람에 의해 지적 다양한 일을 관리합니다. '널 (null)'ASCII.자를 구분 기호로 사용합니다. xargs의 -0 옵션은 'null'문자를 구분 기호로 인식합니다. 파일 이름을 공백으로 올바르게 관리합니다.
    • --replace 옵션은 현재 처리 된 파일로 나오지 백업 최대 .save
    • 바로 가기와 같은 & & 작업으로 파일의
    • -i 옵션을 '{}'문자열을 대체하는 데 사용됩니다 if. 그것은 쉬운 일이 이런 종류의 수 : 식의 두 번째 부분은 첫 번째 부분은

    을 helsp 희망,

    관련 문제