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

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

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

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

答え2

Awk回避策(入力ファイル形式によって異なります):

version="23.092.12"
awk -v ver="$version" '$1 == ver' /tmp/generic_version

出力:

23.092.12  # version approve 

答え3

ファイルの1行あたりのgeneric_versionバージョン番号が含まれており、次のいずれかの行$versionと正確に一致できるとします。

grep -xF "$version" generic_version

この-Fフラグを使用すると、grepパターンが正規表現ではなく固定文字列として解釈されると同時に、一致が行-x全体に適用されます(正規表現パターンで使用されているかのように^)。$


問題のファイル形式を公開した後:

awk -v v="$version" '$1 == v' generic_version

versionこれにより、スペースで区切られた最初の列が変数値と同じファイルのすべての行が出力されます。

関連情報