2014-11-06 13 views
-1

나는 오랜 시간 동안이 문제에 이미 귀찮습니다. 텍스트 파일의 문자열과 일치 시켜서 C- 주석을 제거해야합니다. 편집은 내부 또는 새 파일로 수행해야합니다 (mv 명령을 밀어서 이동시킵니다).Bash : 문자열을 찾아 그 주변에있는 c-commentary 기호를 제거하십시오. (바람직하게는 inplace edit)

/* 
    might be text here; 
    STRING_TO_MATCH 
    some text; 
    more text 

    maybe brackets (might be text and numbers 123); 
*/ 

문자열을 쉽게 찾을 수 있지만 어떻게 주석을 제거 할 수 있습니까? 줄 수는 항상 같지 않습니다. 나는 제거가 욕심이 없어야하고 (변경되지 않아야하는 동일한 파일에있는 유사한 데이터가 있기 때문에) 이해할 수 없으며 전반적인 "패턴"은 여러 줄입니다. 원하는 출력 :

찾기 string_to_match 첫 */다음/* 및 제거 제는 다음 제거 이전 찾기 :

might be text here; 
    STRING_TO_MATCH 
    some text; 
    more text 

    maybe brackets (might be text and numbers 123); 

나는 워크 플로가 같아야 같아요. 이 솔루션은 자동으로 또한 강타 - 아마추어에서 미리

/* STRING_TO_MATCH 
    some text; 
    more text 

    maybe brackets (might be text and numbers 123); 
*/ 

큰 감사를 위해 일한다면

그것은 좋은 것입니다! SED에 성공하지 못했습니다. AWK 솔루션과 바보 증명 설명도 환영합니다. 인사말!

답변

0

내가 해냈어. 확실히 쉬운 솔루션이 있어야합니다. 이것은 일치 항목의 줄 번호를 찾아서 저장하고 거기에서 첫 번째/*로 거꾸로 되돌립니다. 그 후 같은 절차, 다른 방향으로 * /. 추한,하지만 누군가에게 유용 할 수 있습니다. 개선 제안은 매우 환영합니다!

STRING_TO_MATCH="STRING_TO_MATCH" 
file="/home/simon/testfile" 
match_line=`cat $file | grep -n "$STRING_TO_MATCH" | awk '{print $1}' | sed 's/://g' ` 

for ((i=0; i<=20; i++)) #20 is just a treshhold 
do 
    search_line=`expr $match_line - $i` 

    if sed -e "$search_line!d" $file | grep '\/\*' 
    then 
     sed -ie "$search_line s/\/\*//" $file 
     break 
    fi 

done 

for ((i=0; i<=20; i++)) #20 is just a treshhold 
do 
    search_line=`expr $match_line + $i` 

    if sed -e "$search_line!d" $file | grep '\*\/' 
    then 
     sed -ie "$search_line s/\*\///" $file 
     break 
    fi 

done