sed를 사용하여 파일의 버전 번호 바꾸기

sed를 사용하여 파일의 버전 번호 바꾸기

파일의 버전 번호를 업데이트해야 합니다. 파일에는 아래와 같이 의미론적 버전 번호를 포함하는 줄이 있습니다.

foo.bar.blah.blub#10.6.1

이제 "blah.blub" 접두사를 찾아 올바른 줄을 식별하고 버전 번호를 바꾸고 싶습니다.

내가 얻는 다음은 분명히 작동하지 않습니다.

sed -i -e 's/^blah.blub#\d\.\d\.\d$/blah.blub'${VERSION}/$ README.MD

답변1

Sed는 기본적으로 기본 정규 표현식을 사용하는데, 대부분의 구현(사용 중인 것으로 보이는 GNU 구현 포함)은 이를 이해하지 못합니다 \d. 또한 귀하의 줄은 로 시작하지 않으므로 일치하지 않는다는 의미입니다 blah.blub. ^그리고 기타 다양한 문제들.

이렇게 하면 필요한 작업이 수행됩니다.

sed -i -E "/blah\.blub#/s/#.*/#$VERSION/" README.MD

그러면 a 뒤의 텍스트가 #의 내용으로 대체됩니다 $VERSION. 단, 해당 행에 가 포함된 경우에만 해당됩니다 blah.blub. 이제 이 행 하나만 표시하셨기 때문에 이것이 귀하의 데이터에 충분히 구체적인지 모르겠습니다.

답변2

-i그리고 특징 \d입니다 perl. 일부 sed구현에서는 이러한 기능 중 하나 또는 둘 다(예: ast-open's) 추가되지만 어떤 경우에도 두 기능 모두 명령의 표준 사양에 포함되지 않으며 sed이식 가능하지 않습니다.

여기서는 실제를 사용할 수도 있습니다.

export VERSION
perl -pi -e 's/^([\w.]*\.)?blah\.blub#\K\d+\.\d+\.\d+$/$ENV{VERSION}/' README.MD

여기에는 0개 이상의 선택적 시퀀스가 ​​허용됩니다.단어문자 또는 점, 앞의 점으로 끝나며 blah.bluh원본 버전 번호의 3개 구성 요소 각각에 대해 두 개 이상의 숫자가 허용됩니다.

또한 코드 표현식이 아닌 환경 변수를 통해 새 버전 문자열을 전달하므로 더 안전하고(임의 코드 삽입 취약점 방지) 더 안정적입니다(새 버전 텍스트에 모든 문자 또는 바이트 값 허용).

관련 정보