sed는 문자열을 찾아 교체합니다.

sed는 문자열을 찾아 교체합니다.

여러 파일에 다음 줄이 있습니다.

<update>2013-02-10</update>
<version>1.15</version>

(새 날짜 및 버전)으로 바꾸고 싶습니다.

<update>2019-06-30</update>
<version>1.28</version>

sed 또는 awk를 사용하여 여러 파일에 대해 이 작업을 어떻게 수행할 수 있나요? (저는 Mac 운영체제를 사용하고 있습니다)

편집 1: 줄이 <update> and <version>하나씩 차례로 표시되지 않으므로 해당 줄이 나타날 때마다 바꾸고 싶습니다.

편집 2: 날짜는 다르지만 문자열은 <update>그렇지 않으므로 "2013-02-10"을 찾아 "새 날짜"로 바꿀 수 없습니다.

답변1

sed -i backup -E '/<update>/s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/;/<version>/s/[0-9]\.[0-9]{1,2}/1.28/' *
  • -i backup파일이 있는 위치에서 편집하되 확장자를 유지하는 것을 의미합니다 backup. 명령이 예상한 대로 작동하면 삭제할 수 있습니다. 다른 일을 한다면 백업이 있어서 다행일 것입니다!
  • -E정규식을 확장하는 데 사용됩니다. 이스케이프할 필요가 없으므로 스크립트를 더 읽기 쉽게 만듭니다.{}
  • 패턴이 있는 각 행에 대해 날짜 문자열을 /<update>/지정된 날짜로 바꿉니다.s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/####-##-##
  • 패턴이 있는 각 줄에 대해 버전 문자열을 /<version>/지정된 버전으로 바꾸 거나s/[0-9]\.[0-9]{1,2}/1.28/#.##.##

답변2

두 개의 명령을 입력해도 괜찮다면 다음을 사용할 수 있습니다.

sed -i 's/\<update\>2013-02-10\<\/update\>/2019-06-30\<\/update\>/g' *

sed -i 's/\<version\>1.15/1.28\<\/version\>/g' *

파일이 있는 홈 디렉터리에 있습니다.

또는 재귀적으로 수행하려는 경우:

find ./ -type f -exec sed -i 's/\<update\>2013-02-10/2019-06-30\<\/update\>/' {} \;

find ./ -type f -exec sed -i 's/\<version\>1.15/1.28\<\/version\>/' {} \;

관련 정보