我需要从文件中获取特定的版本字符串(称之为version.lst)并使用它来比较shell脚本中的另一个.例如,该文件包含如下所示的行:
V1.000 -- build date and other info here -- APP1
V1.000 -- build date and other info here -- APP2
V1.500 -- build date and other info here -- APP3
Run Code Online (Sandbox Code Playgroud)
.. 等等.假设我试图从APP1获取第一个版本(在本例中为V1.000).显然,版本可以改变,我希望它是动态的.我现在所做的工作:
var = `cat version.lst | grep " -- APP1" | grep -Eo V[0-9].[0-9]{3}`
Run Code Online (Sandbox Code Playgroud)
管道到grep将获得包含APP1的行,第二个管道到grep将获得版本字符串.但是,我听说grep不是这样做的,所以我想学习使用awk或sed的最佳方法.有任何想法吗?我是两个新手,并没有找到足够简单的教程来学习它的语法.他们支持egrep吗?谢谢!
Pau*_*ce. 11
试试这个来获得完整版本:
#!/bin/sh
app=APP1
var=$(awk -v "app=$app" '$NF == app {print $1}' version.lst)
Run Code Online (Sandbox Code Playgroud)
或者只获得主要版本号,最后一行可以是:
var=$(awk -v "app=$app" '$NF == app {split($1,a,"."); print a[1]}' version.lst)
Run Code Online (Sandbox Code Playgroud)
使用sed
以获得完整版本:
var=$(sed -n "/ $app\$/s/^\([^ ]*\).*/\1/p" version.lst)
Run Code Online (Sandbox Code Playgroud)
或者这只得到主版本号:
var=$(sed -n "/ $app\$/s/^\([^.]*\).*/\1/p" version.lst)
Run Code Online (Sandbox Code Playgroud)
说明:
第二个AWK命令:
-v "app=$app"
- 将AWK变量设置为等于shell变量$NF == app
- 如果最后一个字段等于变量的内容(NF
是字段数,$NF
则第N个字段的内容也是如此){split($1,a,".")
- 然后在点处分割第一个字段print a[1]
- 并打印拆分结果的第一部分该sed
命令:
-n
- 除非指示,否则不要打印任何输出"/ $app\$/
- 对于以(\$
)结束的任何行,以shell变量的内容为例$app
(不是用双引号来扩展变量,最好是逃避第二个美元符号)s/^\([^ ]*\).*/\1/p"
- 从line(^
)的开头开始,捕获\(\)
由[^ ]
任意数字(零或更多*
)的非空格()(或第二个版本中的非点)组成的字符序列并匹配但不捕获全部line(.*
)上的其余字符,将匹配的文本(在本例中为整行)替换为捕获的字符串(版本号)(\1
指第一个(仅在此情况下)捕获组,并且打印它(p
) 归档时间: |
|
查看次数: |
15936 次 |
最近记录: |