sed 명령은 정규식을 사용하여 주요 부 버전 번호를 바꿉니다.

sed 명령은 정규식을 사용하여 주요 부 버전 번호를 바꿉니다.

버전의 주, 부, 릴리스 번호를 대체하기 위해 Sed를 사용하고 있습니다.

나는:

버전=10.2.0.1(버전=major.minor.release.buildnumber)

나는 바꾸고 싶지 않다빌드 번호이 버전 번호에서는. sed명령을 사용하여 메이저, 마이너 및 버전을 변경하고 싶습니다 .

기존의

version=10.20.0.1

출력을 원합니다 version=11.21.2.1 (빌드 번호는 변경되어서는 안 됩니다(내 빌드의 마지막 부분)).

나는 다음 명령을 사용합니다

sed -i -r s/version=(.*)/version=11.21.2/g <filename>

그것이 제공하는 출력은 다음과 같습니다.

version=11.21.2 

이것은 내 요청이 아닙니다.

답변1

호환되는 sed명령은 다음과 같습니다.

$ sed 's/version=[1-9]\+[0-9]*\.[0-9]\+\.[0-9]\+/version=11.21.2/' <<<'version=10.20.0.1'
version=11.21.2.1

또는 다음과 같이:

sed 's/version=[1-9]\+[0-9]*\(\.[0-9]\+\)\{2\}/version=11.21.2/' <<<'version=10.20.0.1'

또는 다음과 같이:

sed -E 's/version=[1-9]+[0-9]*(\.[0-9]+){2}/version=11.21.2/' <<<'version=10.20.0.1'

또는 아래와 같이 버전 Major_number가 부 및 릴리스 부분과 같이 0으로 시작할 수도 있는 경우:

sed -E 's/version=([0-9]+\.){3}/version=11.21.2./' <<<'version=10.20.0.1'

답변2

여기서는 버전 문자열(숫자가 아닌 문자열)이 마침표로 구분된 4개의 필드로 구성되어 있다고 가정해야 합니다. 따라서 마지막 항목을 정규식의 LHS로 캡처하세요.

또한 줄의 시작 부분에 먼저 초점을 맞추고 version=문자 뒤의 부분만 터치하는 것이 좋습니다 =. \이스케이프가 셸에서 선점되지 않도록 정규식을 작은따옴표로 묶습니다 . 또한 나중에 사용하기 위해 보관하지 않으므로 경기 도중 (및 주변을 사용할 필요가 없습니다.)

sed -i -r '/version=/s/=.*\.[0-9][0-9]*$/version=11.21.2/g' <filename>

위에서는 마지막 필드에 여러 개의 숫자가 허용됩니다. 다음과 같은 경우 임의의 문자를 넣을 수 있습니다.

sed  -r '/version=/s/=.*\.([^.]*)$/=11.21.2.\1/g' <filename>

임의의 변경 사항을 입력으로 전달하려면 다음과 같이 말하세요.

newver=11.21.2
sed  -r '/version=/s/=.*\.([^.]*)$/='${newver}'.\1/g' <filename>

답변3

대체할 버전 문자열 부분을 명령이 어떻게 알 수 있을까요? .*나머지 라인 전체와 일치 하므로 모든 항목이 교체됩니다.

이제 바꾸려는 숫자 3개만 일치하는 패턴을 정의하거나(α sнιn이 답변에서 다르게 수행한 방식) 다음과 같은 인용문을 사용하여 빌드 번호를 유지할 수 있습니다 s/=.*(\..*)/=11.21.2\1/. 리터럴 포인트 와 일치하므로 \.마지막 포인트와 그 이후의 모든 항목은 첫 번째 포인트와 일치할 수 없습니다 .*. 따라서 빌드 번호가 일치합니다 (\..*). 이를 입력하면 ()교체 시 액세스할 수 있습니다 \1.

α sнιι의 답변에 있는 정규식보다 더 쉽기 때문에 이 답변을 추가하고 있습니다. 어쩌면 맛의 문제일 수도 있습니다.

관련 정보