버전의 주, 부, 릴리스 번호를 대체하기 위해 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нιι의 답변에 있는 정규식보다 더 쉽기 때문에 이 답변을 추가하고 있습니다. 어쩌면 맛의 문제일 수도 있습니다.