많은 헤더와 소스 파일이 포함된 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]
또는 사용다루기 힘든
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