我试图在bash脚本中解析一些数据,并测试版本号的第二部分。下面是一些示例文本,存储在一个名为myinfo的变量中
Application 2021:
Version: 16.3.2.151
--
Application 2020:
Version: 15.1.3.302我只需要捕获以16 (本例中的3)开头的第二部分,并测试它是否为3或更高版本。
我尝试了很多不同的答案,在网上似乎是相关的,但没有成功。
例如,我得到的最接近的是使用regex (?:\b16\.)(\d) works在regexr上找到16.3,但我还没有弄清楚如何只捕获3(如果我更了解regex,可能很容易)。
更新:
感谢保罗·霍奇斯简洁的回答。背景是,我需要找到用户在系统上的Adobe的确切版本。16.3及以上版本在脚本的其余部分需要不同的行为。这可以适用于任何需要知道应用程序版本号的情况。下面是最后一个脚本,利用我选择的解决方案:
#!/bin/bash
# Ask system_profiler for information about all the installed applications
# then use fgrep to pull out the line, and the 2 lines after, that starts with Adobe InDesign 2021
v=$(system_profiler SPApplicationsDataType | fgrep -A 2 ' Adobe InDesign 2021')
echo ${v}
# Adobe InDesign 2021:
#
# Version: 16.3.2.151
# Strip everything up to the first .
v="${v#*.}"
# Strip everything after the first . of the remaining text
v="${v%%.*}"
echo "${v}"
# 3
# Test if it is greater or equal to 3
if [[ "${v}" -ge 3 ]]; then
echo Its 3 or greater
else
echo Less than 3
fi发布于 2021-07-15 17:56:38
参数解析可以在几个步骤中完成,而不需要运行子进程。
假设
x="Application 2021:
Version: 16.3.2.151
--
Application 2020:
Version: 15.1.3.302"然后
x="${x#*.}"从前面到第一个点,把所有的东西都剥掉,
x="${x%%.*}"从现在开始到最后,把所有的东西都剥掉。
echo $x
3所以如果你的数据在x中,
x="${x#*.}"; echo ${x%%.*}将输出3。
如果您想要更精确的解析,请激活扩展全局。
$: shopt -s extglob
$: y="${x//*Application+([[:space:]])2021:+([[:space:]])Version:+([[:space:]])+([0-9])./}"
$: echo "${y%%.*}"
3请记住,这是全局的,而不是真正的正则表达式解析。
为此,请使用sed或awk,尽管这样可以很好地完成任务。
有关全球化的更多详细信息,c.f。https://mywiki.wooledge.org/glob
有关基本参数解析的更多信息,请参见c.f。https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
发布于 2021-07-15 17:08:36
假设只有一组与Application 2021:和Version:匹配的行
输入变量:
$ typeset -p myinfo
declare -- myinfo="Application 2021:
Version: 16.3.2.151
--
Application 2020:
Version: 15.1.3.302"sed的一个想法是:
$ sed -En '/^Application 2021:/,/^Version:/ s/^Version: [^\.]*\.([^\.]+).*/\1/p' <<< "${myinfo}"
3其中:
-En --支持E regex regex;space'/^Application 2021:/,/^Version:/抑制打印模式的默认行为-查找第一行以Application 2021:开头的行范围,最后一行以以Version: + <anything_not_a_period> + . (文字周期) ...([^\.]+)开头的行(在所需的行范围内)开始( period.*后的文字周期)--第一捕获组是所有不是文字period.*的东西--匹配行H 129/\1/p -打印第一个捕获组
将此值捕获到变量中:
$ v=$(sed -En '/^Application 2021:/,/^Version:/ s/^Version: [^\.]*\.([^\.]+).*/\1/p' <<< "${myinfo}")
$ echo "${v}"
3从这里开始,OP可以使用变量${v}做任何想做的事情,例如:
if [[ "${v}" -gt 3 ]]; then ...发布于 2021-07-15 18:22:24
awk -F'[ :.]' '
$1 == "Application" && $2 == 2021 {p = 1}
p && $1 == "Version" {print $4; exit}
' <<<"$myinfo"https://stackoverflow.com/questions/68397917
复制相似问题