여러 파일에서 특정 텍스트 바꾸기

여러 파일에서 특정 텍스트 바꾸기

헤더와 소스 파일이 많은 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

관련 정보