SED를 사용하여 정규식으로 캡처된 버전 번호를 다른 버전 번호로 바꾸는 방법은 무엇입니까?

SED를 사용하여 정규식으로 캡처된 버전 번호를 다른 버전 번호로 바꾸는 방법은 무엇입니까?

다음 sed 명령을 사용하려고 합니다.

sed 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

내용을 대체하기 위해test.txt

shared:core:0.0.2

나는 그럴 것이라고 기대한다

shared:core:1.1.1

그러나 아무 일도 일어나지 않았습니다. sed 작동 방식에 대한 몇 가지 팁이 필요한 것 같습니다.

답변1

당신은 (foo)이 수단을 사용하고 있습니다포착foo. 그러나 기본적으로 이는 리터럴 다음에 또 다른 sed문자로 읽혀지며 , 입력에 또는 가 없으므로 일치하지 않습니다.(foo)()

sed캡처 괄호를 사용 하려면 (\(foo\)) 또는 를 사용해야 합니다 -E. 그러나 실제로 캡처하려는 대상을 언급한 적이 없으므로 여기서는 이것이 전혀 필요하지 않습니다. 필요한 것은 다음과 같습니다.

$ sed 's/shared:core:.*/shared:core:1.1.1/' file 
shared:core:1.1.1

심지어:

$ sed -E 's/(shared:core:).*/\1:1.1.1/' file 
shared:core::1.1.1

아니면 더 간단합니다:


$ sed -E 's/(.*):.*/\1:1.1.1/' file 
shared:core:1.1.1

이제 입력이 더 복잡하고 일치하려는 항목이 1~4개 숫자를 1~5회 반복하는 경우에는 1~6회 반복합니다. 그 뒤에는 1~6개의 영숫자(사용 중인 정규식에서 수행하는 작업)가 따라오며, 버전을 사용하고 추가하면 됩니다 -E( sed구현에서 지원한다고 가정).

$ sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' file 
shared:core:1.1.1

또는 다음을 사용할 수 없는 경우 -E:

$ sed  's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' file 
shared:core:1.1.1

100% 이식성이 없을 수도 있다는 걱정이 들긴 하지만 확실하지는 않습니다.

마지막으로, sed이 옵션을 제공하지 않으면 -i입력 파일이 변경되지 않는다는 점을 기억하세요. 따라서 원본 파일을 변경하려면 sed -i .... file.

답변2

기본적으로 sed기본 정규식이 사용됩니다. -E정규식을 확장하는 옵션이 추가되었습니다 . 그러므로:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

또는 기본 정규식으로 변환하세요. 그러므로:

sed 's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' test.txt

또한 파일 내용을 변경하려면 -i"현재 위치" 변경을 발생시키는 옵션을 추가해야 합니다. 그러므로:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' -i test.txt

관련 정보