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のオプション解析は非常に安定しており、いくつかの点を組み合わせて変更リストを自動的に生成することができました。

スクリプト(安全のためにこの回答では1行に圧縮されています)...

#! /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

おすすめ記事