sed 或 grep 在一组括号之间读取

sed or grep to read between a set of parentheses

我正在尝试从某些命令的输出中读取一组括号之间的版本号:

Test Application version 1.3.5

card 0: A version 0x1010000 (1.0.0), 20 ch

Total known cards: 1

我想要的是 1.0.0。 我试过 sed 和 grep 的变体:

command.sh | grep -o -P '(?<="(").*(?=")")'

command.sh | sed -e 's/(\(.*\))//'

还有很多变化。运气不好:-(

帮忙?

你快到了!在 pgrep 中,使用反斜杠来保留括号的字面意思,而不是双引号:

grep -o -P '(?<=\().*(?=\))'

有了 GNU grep,您还可以使用 perl 模式下可用的 \K 转义序列:

grep -oP '\(\K[^)]+'

\K 删除到目前为止匹配的内容。在这种情况下,开始的 ( 将从比赛中移除。

或者您可以使用 awk:

awk -F'[()]' 'NF>1{print }'

该命令使用括号作为分隔符来拆分输入行。一旦一行被分成多个字段(意味着找到括号)版本号是第二个字段并被打印。


顺便说一句,您显示的 sed 命令应该是:

sed -ne 's/.*(\(.*\)).*//p'

有几个变体可以使用。首先用 grepsed:

grep '(' filename | sed 's/^.*[(]\(.*\)[)].*$//'

或使用简短的 shell 脚本:

#!/bin/sh

while read -r line; do
    value=$(expr "$line" : ".*(\(.*\)).*")
    if [ "x$value" != "x" ]; then 
        printf "%s\n" "$value"
    fi
done <""

您给定的输入文件 return 1.0.0