次の変更ログが見つかりましたが、すべて変更/新機能が一覧表示されます。日付代わりにバージョン番号:
2014-09-06 - 現在:https://fossies.org/linux/sed/ChangeLog
2005年5月18日から2012年12月29日まで:https://github.com/bonzini/sed/blob/master/ChangeLog(このGitHubリポジトリは古いようです)
リポジトリが
git://git.sv.gnu.org/se
最新のようですが、ChangeLog-2014
エントリが2014-09-06で終わるファイルは1つしか見つかりません。
たとえば、/オプションがどの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: -E
2004年8月22日バージョン4.2に初めて登場しましたが、ログや公式文書には記載されていません。このオプションはgitで最初に言及されました。2013年10月16日に提出されました(9年以上後!)と「EREドキュメントの「-E」オプションを使用してください。」。
他の場合、変更ログは非常に誤解を招く可能性があります。
例2:Changelog-2014
最初の参照は-r
2000-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
どおりに印刷され、そのオプションが省略されている場合)。b
abc
-r
だからそれは最良の方法機能がいつリリースされるかを調べて、すべてのバージョンのソースコードを確認してください。最初は難しいようですが、少なくともコマンドラインオプションを使用すると非常に簡単です。main()
関数を検索し、そのargv
関数がどこで使用されているかを確認してください。
git://git.sv.gnu.org/sed
これも不完全であることに注意してください。最も古いコミットは2004年のコミット(確認git log --reverse
)であり、最も古いタグにはv4.1.5
2006年バージョンのタグが付けられています(確認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
答え2
gitレコードがあり、GNU sed開発者がバージョンにgitタグを追加したため、探しているバージョンは4.2.2で、そのタグは4年前に追加されました(4.2.1のタグは8年前に追加されました。、2012年以前は明らかでした)。これ4.2.2 ログコミットの追加も含まれます-z
。また、ソースを複製した場合は、次のものがあります。このコミットにはどのタグが含まれていますか?:
git tag --contains <commit>