다음 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