sed가 교체 항목에 0을 추가하는 이유는 무엇입니까?

sed가 교체 항목에 0을 추가하는 이유는 무엇입니까?

이 변수를 "5.6.10" 값으로 바꾸고 싶습니다.

VERSION=5.4.38

현재 값을 알면 무엇을 해야 할지 알 수 있다(5.4.38)

sed s:VERSION=5.4.38:VERSION=5.6.10:g

그런데 값을 모르더라도(많은 파일이나 스크립트에 유용함) 5.6.10의 내용으로 바꾸고 싶습니다. 나는 이것을 시도했다

sed s:VERSION=[0-9].[0-9].[0-90-9]:VERSION=5.6.10:g

그런데 결과가 이상하네요

VERSION=5.6.100

10이 100이 된 이유는 무엇일까요?

나도 시도했다

sed s:VERSION=[0-9].[0-9].[0-9]:VERSION=5.6.10:g

나는 같은 결과를 본다.

답변1

[0-90-9]임의의 숫자일 수 있는 문자와 일치합니다. 당신이 의미하는 것은 [0-9][0-9]두 숫자가 정확히 일치한다는 것입니다. 두 시도 모두에서 의 마지막 숫자가 5.6.100정규식과 일치하지 않으므로 출력에 변경되지 않은 상태로 나타납니다.

또 다른 잠재적인 문제는 .정규식의 특수 문자입니다. 이는 모든 문자와 일치합니다. 예를 들어 [0-9].[0-9].[0-9][0-9]match 123.45또는 1a2b34.는 점을 일치시키는 데 사용됩니다 \.. 특수 문자 앞에 백슬래시가 있으면 특수 문자가 아닙니다.

또한 버전 번호의 자릿수는 더 많거나 적을 수 있습니다. [0-9.]*원하는 수의 포인트나 숫자를 일치시키는 데 사용됩니다 . ( .괄호 안에 있으면 특수 문자가 아닙니다.) 보다 정확하게는 [0-9.]*점과 숫자의 가능한 가장 긴 순서와 일치하므로 모두 일치합니다. [0-9][0-9.]*처음에 하나 이상의 숫자를 강제로 적용하려면 이 옵션을 사용하십시오.

sed 's:VERSION=[0-9][0-9.]*:VERSION=5.6.10:g'

답변2

sed쉘이 파일 이름 글로빙 패턴으로 확장하지 않도록 표현식을 올바르게 인용했다고 가정하면 명령은 다음과 같습니다.

sed 's:VERSION=[0-9].[0-9].[0-90-9]:VERSION=5.6.10:g'

문자열을 VERSION=5.4.38( VERSION=5.6.108가 아닌 VERSION=5.6.100)으로 변환합니다. [0-90-9]일치하기 때문에 이렇게 됩니다 .하나의특징. 따라서 VERSION=5.4.3로 대체되고 VERSION=5.6.10후행은 유지됩니다 8.

대체의 다른 이상한 점으로는 sed점을 이스케이프 처리하지 않고(단일 문자와 일치함) /g끝에 점을 사용하는 것입니다. 비록 내가 아는 한 여러 문자열을 단일 행과 일치시키고 싶지 않더라도 점을 사용하는 것입니다.

임의의 숫자 문자열이 동일할 수 VERSION=xx.yy.zz있는 양식의 패턴을 바꾸려면 다음을 사용하십시오.xx

sed 's/\(VERSION=\)[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}/\15.6.10/'

[0-9]또는 대신 사용하려면 다음을 수행하십시오 [[:digit:]].

sed 's/\(VERSION=\)[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/\15.6.10/'

혹은 기본 정규식 대신 확장 기능을 사용하고 싶다면,

sed -E 's/(VERSION=)[0-9]+\.[0-9]+\.[0-9]+/\15.6.10/'

아니면 더 압축하고 싶다면,

sed -E 's/(VERSION=)([0-9]+\.){2}[0-9]+/\15.6.10/'

아니면 실제로,

sed 's/\(VERSION=\).*/\15.6.10/'

VERSION=... 문자열의 모든 내용을 제거하기만 하면 됩니다 .

답변3

해결책을 찾고 포인트를 추가하세요. 이는 5.5.10, 6.4.20, 3.2.20 등에서 작동합니다.

sed s:VERSION=[0-9].[0-9].[0-9].:VERSION=5.6.10:g 

하지만 1.2.3 4.5.1 3.2.9에서는 그렇지 않습니다. 이 쌍에서는 이 줄이 잘 작동합니다.

sed s:VERSION=[0-9].[0-9].*.:VERSION=5.6.10:g 

관련 정보