이 변수를 "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