【问题标题】:How to extract a number from a string using grep and regex如何使用 grep 和正则表达式从字符串中提取数字
【发布时间】:2013-12-25 08:54:46
【问题描述】:

我制作了一个文件的猫,并使用这样的正则表达式在其上应用grep

cat /tmp/tmp_file | grep "toto.titi\[[0-9]\+\].tata=55"

命令显示以下输出

toto.titi[12].tata=55

是否可以修改我的 grep 命令以提取数字 12 作为命令的显示输出?

【问题讨论】:

  • 您可以添加另一个 grepsed 以删除此信息。
  • @AndrewLogvinov 我可以通过将以下管道添加到我的命令 | cut -f2 -d'[' | cut -f1 -d']' 来做到这一点,但我想知道如何使用相同的 grep
  • 恐怕你不能只用一个grep
  • 是的,它可以使用 -P (PCRE) 开关在单个 grep 中完成。我在下面提供了答案。
  • @anubhava 非常感谢您的时间和精力

标签: regex linux bash shell grep


【解决方案1】:

您可以使用其正则表达式功能在纯 BASH 中获取它:

s='toto.titi[12].tata=55'
[[ "$s" =~ ^toto.titi\[([0-9]+)\]\.tata=[0-9]+$ ]] && echo "${BASH_REMATCH[1]}"
12

你也可以使用sed:

sed 's/toto.titi\[\([0-9]*\)\].tata=55/\1/' <<< "$s"
12

或者使用 awk:

awk -F '[\\[\\]]' '{print $2}' <<<"$s"
12

【讨论】:

    【解决方案2】:

    使用前瞻

    echo toto.titi[12].tata=55|grep -oP '(?<=\[)\d+'
    12
    

    不用perl正则表达式,用sed代替"["

    echo toto.titi[12].tata=55|grep -o "\[[0-9]\+"|sed 's/\[//g'
    12
    

    【讨论】:

    • 我正在使用来自busybox的有限版本的grep,它不支持-P选项
    • @MOHAMED sed 怎么样?匹配 [12 并使用 sed 替换 [.
    【解决方案3】:

    将其传递给sed 并使用反向引用:

    cat /tmp/tmp_file | grep "toto.titi\[[0-9]\+\].tata=55" | sed 's/.*\[(\d*)\].*/\1/'
    

    【讨论】:

    • 您现在应该知道grep 可以读取文件并且不需要cat
    • @Jotne 我知道...我只是采用了 OP 的部分解决方案,并用螺栓固定了所需的额外部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多