2017-01-17 1 views
0

나는 파일이 여러 개 있는데, printf이라는 줄을 찾고 그 줄에 코드를 주석으로 처리하기 전에 //을 추가하고 싶습니다. 나는 파이썬을 사용하여 각 파일을 읽고 변환을 수행하고 변환 된 텍스트를 다시 작성할 수 있지만 너무 복잡합니다. 다른 쉬운 방법이 있습니까? 나는 sedawk과 같은 것을 생각했지만 표현식을 쓰는 방법을 모르거나 sed/awk을 사용하여이 작업을 완료 할 수 있는지 여부를 고려했습니다.텍스트 파일의 특정 줄을 찾고이를 조작하는 방법은 무엇입니까?

+0

없음의 해당하는 명령 줄을 사용하여, 같은 한 줄에

for i in *.c; do printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i"; done 

(또는) 명령 줄 친화적 인 버전을 사용, 그것은이다 코드가 작성된 특정 C 변종에 대한 구문 분석기없이이 작업을 강력하게 수행 할 수 없습니다. 일부 입력 파일 내용의 경우 모든 게시 된 응답이 실패합니다. –

답변

3

awk.

  • sub(/^/,"//")이 기록 //의 시작 부분에 추가 그들에 printf 레코드에 대한

    • /printf/ :

      $ awk '/printf/ { sub(/^/,"//") } 1' *.c 
      

      는 설명 : 거기에는 샘플 데이터 없었다 내가 더이 .c 주위에 파일이 없었로 그것은 안된입니다

    • 1 암시 적 인쇄

    이 해결책은 stdout에 출력을 출력합니다. 이것은 여러 파일을 처리하는데 약간 문제가있을 수 있습니다. 이를 처리하는 한 가지 방법은 Gnu awk v. 4.1.0 이상 및 inplace edit : gawk -i inplace을 사용하는 것입니다. 암시 적 인쇄를 { print > "edited-" FILENAME }으로 변경하여 편집 된 각 파일을 새 파일 (예 : file.c에서 edited-file.c)에 인쇄하는 등 다른 파일로 출력 할 수도 있습니다. 솔직히, 나는 @ sat의 sed 해결책을 나 자신으로 사용할 것이다. sed

  • 5

    :

    sed '/printf/s~^~//~g' *.c 
    

    가 @SLePort에 의해 제안,
    sed 's~.*printf~//&~' *.c 
    

    현재 위치에서 편집에 사용 -i.

    일치를위한 또 다른 방법은 정확히 printf은 (printf 가정하면 항상 개행에서 시작) :

    sed 's~^\([\t ]*\)\(printf\)~\1//\2~g' file 
    
    +0

    아니면 sed의 ~. * printf ~ // & ~ ''. 그리고 여기서'g '수정자가 유용하다는 것을 확신하지 못합니다. – SLePort

    3

    ed, UNIX (휴대용, POSIX 호환) -days 및 인 - 할 수있는 루프 이후 사용할 수있는 표준 편집기를 사용하여 장소 교체

    for i in *.c; do 
        printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i" 
    done 
    

    에서

    0

    ,g/printf/ 모든 라인에 printfs/^/\/\//이 포함되어 있으면 해당 라인에 //이라는 단어가 추가됩니다. 그런 다음 wq이 파일을 쓰고 그 파일을 닫습니다.

    ex 편집기 Vim

    for i in *.c; do printf '%s\n' "%g/printf/ s/^/\/\//" w q | ex -s "$i"; done 
    
    +1

    _file_':)'을 편집하는 _ _ 편집기 편집기 _ 및 _ 스트림 편집기 _를 사용해 주셔서 감사합니다. –

    +1

    냄새 나는 사람, 그 사람들은 참으로 좋은 날이었습니다. ++ –

    1
    sed '/printf/ s/^/\/\//' filename 
    
    관련 문제