헤더와 소스 파일이 많은 C 프로젝트가 있습니다. 이 파일에는 프로그램 버전에 대한 설명 줄이 있습니다. 다음과 같은 것 :
/**
* all the file info and stuff....
* VER: 0.01
* rest of comments
*/
//code ....
프로젝트의 모든 하위 폴더에 있는 버전을 반복적으로 편집하고 싶습니다. 파일 중 일부에는 이 줄이 있고 일부에는 없습니다. 표준 gnu/linux 프로그램을 사용하여 어떻게 그렇게 합니까? 추측하고 sed
있거나 grep
도움이 될 수 있습니다!
답변1
이 시도
find . -type f -name '*.[ch]' -exec bash -c '
grep -q "VER: [0-9]" "$1" && sed -i.bak "s/VER: [0-9].*/VER: 1.42/" "$1"
' -- {} \;
.bak(백업 파일)을 생성하는 데 방해가 되지 않으려면 다음과 같이 약간 단순화할 수 있습니다.
find . -type f -name '*.[ch]' -exec sed -i 's/VER: [0-9].*/VER: 1.42/' {} \;
아니면 이거xargs+grep버전
(이름에 공백이 있는 파일은 작업하지 마세요)
grep -rl 'VER: [0-9].*' . |
grep '.*\.[ch]$' |
xargs sed -i 's/VER: [0-9].*/VER: 1.42/'
아니면배쉬 글로스타재귀
shopt -s globstar
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
아니면zsh
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
답변2
파일을 찾은 다음 교체하기 위해 별도의 명령을 수행합니다.
find . -type f \(-name "*.c" -o -name "*.h" \) | xargs grep -l "VER: 0.01" > files;
for file in $(cat files);do sed -i "s/VER: 0.01/VER: 0.02/g" $file
done