ファイルの特定のバージョン番号(またはリビジョン番号)を一致させるための最良の方法は何ですか?
私はいくつかの選択をしましたが、他の最良の方法があると思います(例: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
。
答え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
これにより、スペースで区切られた最初の列が変数値と同じファイルのすべての行が出力されます。