GNU Sed 버전 기록(변경 로그) - 어떤 버전에 어떤 기능이 도입되었는지 확인하는 방법은 무엇입니까?

GNU Sed 버전 기록(변경 로그) - 어떤 버전에 어떤 기능이 도입되었는지 확인하는 방법은 무엇입니까?

다음 변경 로그를 찾았지만 모두 변경 사항/새 기능이 나열되어 있습니다.날짜대신에버전 번호:

예를 들어, / 옵션이 어느 GNU 버전에 sed도입되었는지 알아내려고 하는데 , 위에서는 2012-02-05라고 나와 있지만 어떤 버전 번호에 매핑되어 있는지 알 수 없습니다.-z--null-data

답변1

목록은 이 답변의 끝을 참조하세요.

위에는 2012-02-05라고 나와 있는데 어떤 버전 번호가 매핑되어 있는지 모르겠습니다.

날짜를 버전 번호에 간단히 매핑하려면 다음을 확인하세요.다운로드 섹션존재하다GNU sed의 홈페이지. 테이블 목록이 있습니다

Index of /gnu/sed
Name                   Last modified      Size
[...] 
sed-4.2.1.tar.gz       2009-06-27 18:22   1.1M   
sed-4.2.1.tar.gz.sig   2009-06-27 18:22   72 
sed-4.2.2.tar.gz       2012-12-22 11:01   1.3M   
sed-4.2.2.tar.gz.sig   2012-12-22 11:01   72     
[...]

목록은 알파벳순으로 정렬되어 있으므로 4.2가 나타납니다.뒤쪽에4.2.1. 에 복사하여 붙여넣으면 올바르게 정렬할 수 있습니다 sort -V.

모든 변경 사항이 다음 버전에 릴리스된다고 가정하면 2012-02-05 이후 변경 사항은 버전 4.2.2에 릴리스됩니다.

어떤 버전에 어떤 기능이 도입되었는지 확인하세요.

일반적으로 이것은 매우 까다롭습니다. 하지만ChangeLog-2014함께 git log그들은 GNU sed의 거의 전체 수명주기를 다루지만 모든 변경 사항을 언급하지는 않습니다. 다음 단계는 usage()이전 버전의 문서(man 페이지 및 기능)를 구문 분석하는 것이지만 때로는 불완전할 수도 있습니다.

예시 1: -E2004년 8월 22일 버전 4.2에 처음 등장했지만 로그나 공식 문서에는 언급되어 있지 않습니다. 이 옵션은 git에서 처음 언급되었습니다.2013년 10월 16일에 제출됨(9년 이상 후!) 라고"ERE 문서의 "-E" 옵션을 사용하세요".

다른 경우에는 변경 로그가 매우 오해를 불러일으킬 수 있습니다.

예 2:Changelog-2014첫 번째 참조는 -r2000-12-08에 대한 항목인 것으로 보입니다."sed/sed.c(main): 'r' 및 'R' 옵션 구현". 분명한 것 같습니다. 분명히 -r그 전에는 사용할 수 없었을 것입니다. 그렇죠? ! 아니요, 1998년 버전 3.0.1입니다.
해당 변경 로그 항목이 무엇인지는 확실하지 않지만 버전 3.0.1은 분명히 1998년의 것입니다(소스 파일에는 수정 날짜와 저작권 설명 목록이 있으며 1998은 작년이고 변경 로그에는 3.0.1 릴리스도 언급되어 있습니다) 1998 ) 명시적으로 지원됩니다 -r(해당 버전을 컴파일하고 실행했는데 ./sed -r 's/a(b)c/\1/' <<< abc예상대로 인쇄되고 해당 옵션이 생략된 경우).babc-r

그래서 그것은 다음과 같습니다가장 좋은 방법기능이 언제 출시되는지 알아보고,모든 버전의 소스코드를 확인해보세요. 처음에는 어려워 보일 수 있지만 적어도 명령줄 옵션을 사용하면 매우 간단합니다. main()함수를 검색하고 argv해당 함수가 어디에 사용되는지 확인하세요.

git://git.sv.gnu.org/sed이것도 불완전하다는 점에 유의하세요 . 가장 오래된 커밋은 2004년의 커밋(확인 git log --reverse)이고, 가장 오래된 태그에는 v4.1.52006년 버전의 태그가 지정되었습니다(확인 git log --simplify-by-decoration --format="%ai %d"). 따라서 이전 버전을 확인하려면 앞서 언급한 곳에서 다운로드해야 합니다.웹사이트.
비록 거기에 시간 속에 잃어버린 것이 있다고 해도 말이죠. 버전 4.0.0~4.0.5 예"진위가 확인중이라 확인불가". 하지만 4.0.0과 4.0.6의 차이는 1년도 채 되지 않기 때문에 문제가 되지 않을 것 같습니다.

다행히 GNU sed의 옵션 구문 분석은 매우 안정적이어서 몇 가지 사항을 함께 사용하여 변경 목록을 자동으로 생성할 수 있었습니다.

스크립트(안전을 위해 이 답변에서는 한 줄로 압축됨)...

#! /bin/bash
old=; curl -s "https://ftp.gnu.org/gnu/sed/" | sed -nE 's/.* href="sed-([0-9.]*)(\.tar\.[^."]*)".*([0-9]{4}-..-..).*/\1 \3 sed-\1\2/p' | sort -u -k1,1V | while read version date file; do printf '%-6s %s\n' "$version" "$date"; curl -sO -C- "https://ftp.gnu.org/gnu/sed/$file"; new=$(tar -xaf "$file" -O --wildcards '*/sed.c' | sed -En -e '/"[^" ]*e:[^" ]*"/{s/.*"([^" ]*e:[^" ]*)".*/\1/;s/://g;s/./\n-&/gp}' -e '/longopts\[]/,/};/s/[^"]*"([^"]*)".*/--\1/p' | sort -u); comm -3 <(printf %s "$old") <(printf %s "$new") | awk '{if (/^-/) r=r" "$1; else a=a" "$1} END {if (a!="") print "  new:" a; if (r!="") print "  removed:" r}'; old=$new; done

...다음 목록을 생성합니다.

1.18   1993-06-01
  new:  -e --expression -f --file -h --help
        -n --quiet --silent -V --version
2.05   1994-05-13
3.01   1998-07-23
  new: -r --rxtest
3.02   1998-08-02
4.0.6  2003-03-18
  new: -i --in-place -l --line-length
       -R --regexp-extended --regexp-perl
       -s --separate -u --unbuffered
  removed: --rxtest
4.0.7  2003-04-11
4.0.8  2003-10-21
4.0.9  2004-01-10
4.1    2004-06-15
  new: --posix
  removed: -h
4.1.1  2004-07-06
4.1.2  2004-08-22
4.1.3  2005-01-19
4.1.4  2005-01-28
4.1.5  2006-02-03
4.2    2009-04-30
  new: -b --binary -E --follow-symlinks
4.2.1  2009-06-27
4.2.2  2012-12-22
  new: --null-data -z --zero-terminated
4.3    2017-01-04
  new: --sandbox
4.4    2017-02-03
4.5    2018-03-31
4.6    2018-12-20
  new: --debug
  removed: -R --regexp-perl
4.7    2018-12-21
4.8    2020-01-14

-z여기에서 이 기능이 2012년 12월 22일에 출시된 버전 4.2.2에 처음 등장했음을 알 수 있습니다 .

4.0.6에서 4.5까지의 버전은 -R컴파일 전에 /를 추가해야 하므로 Debian, Ubuntu 및 기타 패키지 버전은 이 옵션을 지원하지 않습니다.--regexp-perl#define REG_PERL

답변2

git 기록이 있고 GNU sed 개발자가 버전에 git 태그를 추가했기 때문에 찾고 있는 버전은 4.2.2이며 해당 태그는 4년 전에 추가되었습니다(4.2.1의 태그는 8년 전에 추가되었습니다., 2012년 이전에는 분명했습니다). 이것4.2.2 로그커밋 추가도 포함됩니다 -z. 또한 소스를 복제한 경우 다음을 찾을 수 있습니다.이 커밋에는 어떤 태그가 포함되어 있나요?:

git tag --contains <commit>

관련 정보