【问题标题】:sed or grep to read between a set of parenthesessed 或 grep 在一组括号之间读取
【发布时间】:2015-11-30 21:12:54
【问题描述】:

我正在尝试从一组括号之间读取版本号,来自某个命令的输出:

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/(\(.*\))/\1/'

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

帮助?

【问题讨论】:

  • 欢迎来到 SO!请添加一些代码。

标签: bash sed command-line-interface


【解决方案1】:

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

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

【讨论】:

  • Riiiight..!当我想念这些小事时,我讨厌它。干杯。
【解决方案2】:

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

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

\K 删除迄今为止匹配的内容。在这种情况下,起始 ( 将从匹配中删除。

您也可以使用awk:

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

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


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

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

【讨论】:

    【解决方案3】:

    有几种变体可以使用。首先是grepsed

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

    或使用简短的 shell 脚本:

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

    对于给定的输入文件,两者都返回 1.0.0

    【讨论】:

    • grep 可以很容易地被分解出来。只需将sed 更改为仅在替换成功时打印:sed -n 's/.*(\([^()]*\)).*/\1/p' filename
    • 是的,我从 hek2mgl 对打印模式空间的抑制中发现了这一点。这是 sed 工具箱的一个。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2015-07-20
    • 2015-07-28
    • 2017-12-13
    • 2023-01-14
    • 2018-04-29
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多