텍스트 블록을 추가하거나 바꾸는 쉘 스크립트?

텍스트 블록을 추가하거나 바꾸는 쉘 스크립트?

.c.h파일(for 및 files) 시작 부분에 저작권 텍스트를 추가하거나 교체 할 수 있는 쉘 스크립트(Bash)를 찾고 있습니다 .

스크립트를 실행하는 상위 디렉토리에 있는 .c모든 파일에 대한 저작권 텍스트 블록을 검색하고 추가하거나 교체해야 합니다..h

기존 저작권 텍스트:

            /* --------------------------------------------------
                Copyright 2014 Author name

                All rights reserved
             ----------------------------------------------------*/

새로운 저작권 텍스트.

             /* Copy right text bla bla bla
              * some license text bla bla bla
              * All rights reserved xyz xyz */

노트

  1. 저작권 텍스트는 파일 시작 부분( .c.h)에만 추가해야 하며, 기존 저작권 텍스트는 항상 파일 시작 부분에 있습니다.

  2. 상위 및 하위 디렉토리의 모든 파일을 검색하고 추가하거나 교체해야 합니다 .c..h

편집하다

내가 시도한 것은 다음과 같습니다.

      for file in `find . -type f -name "*.h"`
       do
       echo $file
       if grep -qRin "                            ----------------------------------------------------------------------\*\/" $file
        then
       echo "Replaced License Text"
         sed '1,/^ ----------------------------------------------------------------------\*\/$/d' < $file | cat licence_file - > $file.new
       mv $file.new $file
      else
    cat licence_file $file >$file.new && mv $file.new $file
     echo "Added License Test"
     fi
      done

License_file에는 새 라이센스 텍스트가 포함되어 있습니다.

답변1

ed"표준 텍스트 편집기"입니다. 일상적인 편집에는 적합하지 않지만스크립트가 쉬움.

ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

첫 번째 명령은 첫 번째 줄에서 a */( *the 와 /이스케이프해야 함)가 포함된 첫 번째 줄까지 삭제합니다. 두 번째 명령은 간단한 삽입입니다. "삽입" 모드 로 i들어가 라고 지시하는 반면, 명령 자체는 삽입 모드를 종료하라고 지시합니다 . "쓰기"를 의미하고 파일을 저장한다는 것은 "종료"를 의미합니다. 모든 것은 a로 시작하고 끝나는 "여기 문서"에 있습니다 (이것은 임의적입니다. 원하는 문자열을 사용할 수 있습니다).ed.edwqEOF

이는 루프에서 쉽게 사용할 수 있습니다.

for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

재귀를 원하면(즉, 하위 디렉터리에서 작업) shopt -s globstar위 명령에서 및를 사용하거나 while 루프를 사용하세요../**/*.{c,h}find

find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

이 작업을 여러 번 수행할 가능성이 있다면 스크립트에 넣는 것이 좋습니다.

#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

이름을 copyright.sh로 지정하고 $PATH 어딘가에 넣고 실행 가능하게 만들면 다음과 같이 간단히 수행할 수 있습니다.

shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done

답변2

조금 지저분하지만 다음 Python은 작동합니다.

#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n                Copyright 2014 Author name\n\n                All rights reserved\n             ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()

이 방법은 원본 텍스트와 대체 텍스트가 다음과 같은 경우에 작동합니다.정확히질문에 제공된 것과 동일한 형식을 사용하십시오(하이픈 포함). 다음 명령을 사용하여 파일이 있는 디렉터리에서 이 Python을 호출합니다.

for i in ./{*.c,*.h} ; do python <scriptname.py> $i ; done

작동 방식:

똑바로. 파일을 열고 해당 줄의 첫 번째 작은따옴표 쌍 사이에 제공된 줄을 frs=fr.replace....같은 줄의 두 번째 작은따옴표 쌍 사이에 제공된 줄로 바꿉니다.

관련 정보