ファイルの特定のバージョン番号(またはリビジョン番号)を一致させるための最良の方法は何ですか?
私はいくつかの選択をしましたが、他の最良の方法があると思います(例:Perl one-liner)
version=23.092.12
cat generic_version | grep "$version"
cat generic_version | grep -F "$version"
cat generic_version | awk -v ver=$version '/ver/'
一般バージョン - 多くのフローティングバージョンを含むファイルです。
はい
cat /tmp/generic_version | ......
予想される結果:
23.092.12 # version approve
ファイルの例
23.087.23 # version approve
23.092.12 # version approve
23.098.45 # version approve
23.099.12 # version under testing
ベストアンサー1
少なくとも23.092.123や1.23.092.12のようなマッチングを避けるために、数字の前後にドットなしでマッチングすることをお勧めします(もちろん、、..$version
も考慮することができます)。簡単にすることもできます。23.092.12-rc1
23.092.12b
23.092.12-2
perl
<generic_version V=$version perl -ne 'print if m{(?<![\d.])\Q$ENV{V}\E(?![\d.])}'
マッチ:
xxx 23.092.12 yyy
xxx23.092.12yyy
23.092.12-pre1
しかし上にはない
23.092.12.2
23.092.123
123.092.12
23.092.12.
とそれぞれ逆方向ナビゲーションと正規表現演算子です。環境変数の内容を正規表現ではなく固定文字列として扱うように使用します(したがって、(?<!...)
文字一致という特別な意味を失います)。(?!...)
\Q...\E
.
編集内容によっては、入力ファイルのバージョン番号が常に行の先頭にあり、常に空白文字が続く場合は、次のように単純化できます。
<generic_version V=$version perl -ne 'print if m{^\Q$ENV{V}\E\s}'
または、awk
最初のフィールドがバージョンである行を一致させるには、次のようにします。
<generic_version V=$version awk '$1 "" == ENVIRON["V"]'
""
文字列比較を強制するために接続が行われます。それがなければ、[いいね]を押すと一致し$version
ます。123.4
123.40
$version
入力でスペースで区切られたフィールドを一致させるには、次のようにします。
<generic_version V=$version perl -ne 'print if m{(?<!\S)^\Q$ENV{V}\E(?!\S)}'
前提は、$version
前後に空白以外の文字()がないことです\S
。