.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 */
노트
저작권 텍스트는 파일 시작 부분(
.c
및.h
)에만 추가해야 하며, 기존 저작권 텍스트는 항상 파일 시작 부분에 있습니다.상위 및 하위 디렉토리의 모든 파일을 검색하고 추가하거나 교체해야 합니다
.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
.
ed
w
q
EOF
이는 루프에서 쉽게 사용할 수 있습니다.
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....
같은 줄의 두 번째 작은따옴표 쌍 사이에 제공된 줄로 바꿉니다.