ファイルのバージョン番号を一致させるための最良の方法は何ですか

ファイルのバージョン番号を一致させるための最良の方法は何ですか

ファイルの特定のバージョン番号(またはリビジョン番号)を一致させるための最良の方法は何ですか?

私はいくつかの選択をしましたが、他の最良の方法があると思います(例: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-rc123.092.12b23.092.12-2perl

<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.4123.40

$version入力でスペースで区切られたフィールドを一致させるには、次のようにします。

<generic_version V=$version perl -ne 'print if m{(?<!\S)^\Q$ENV{V}\E(?!\S)}'

前提は、$version前後に空白以外の文字()がないことです\S

おすすめ記事