![匹配文件中版本号的最佳方法是什么](https://linux22.com/image/128086/%E5%8C%B9%E9%85%8D%E6%96%87%E4%BB%B6%E4%B8%AD%E7%89%88%E6%9C%AC%E5%8F%B7%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88.png)
匹配文件中特定版本号(或版本号)的最佳方法是什么
我做了一些选择,但我认为还有其他最好的方法(如 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
变量值相同的每一行。