匹配文件中版本号的最佳方法是什么

匹配文件中版本号的最佳方法是什么

匹配文件中特定版本号(或版本号)的最佳方法是什么

我做了一些选择,但我认为还有其他最好的方法(如 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

至少,您希望在$version其前面或后面没有数字或点的情况下进行匹配,以避免匹配 23.092.123 或 1.23.092.12 等内容(尽管您可能还想考虑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

假设该文件generic_version每行包含一个版本号,并且$version可能与以下行之一完全匹配:

grep -xF "$version" generic_version

-F标志导致grep将模式解释为固定字符串而不是正则表达式,同时-x强制匹配跨越整行(就像在正则表达式模式中使用了^and一样)。$


在揭示问题中的文件格式后:

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

这将输出文件中第一个空格分隔列与version变量值相同的每一行。

相关内容