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

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

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

관련 정보