【问题标题】:Parse value between two strings in bash在bash中解析两个字符串之间的值
【发布时间】:2013-04-13 20:34:11
【问题描述】:

我对 linux 很陌生,即使我需要一些简单的东西,我也不知道从哪里开始。在 bash 脚本中,我需要解析 HTML 页面中字符串“VOL.”和“”之间的值,并将其传递给变量。

【问题讨论】:

    标签: linux bash curl sed grep


    【解决方案1】:
    newvar=$(grep -oP 'VOL\.\K.*?(?=,)' file.txt)
    echo "$newvar"
    

    或来自字符串:

    newvar=$(grep -oP 'VOL\.\K.*?(?=,)' <<< "$string")
    echo "$newvar"
    

    如果您需要更便携的东西:

    newvar=$(perl -lne '/VOL\.\K.*?(?=,)/ && print $&' <<< "$string")
    echo "$newvar"
    

    正则表达式的解释

    • VOL\. = 文字 VOL.. = regex 中的任何字符,不带反斜杠
    • \K = 重新开始匹配到零,见https://stackoverflow.com/a/13543042/465183
    • .*? = 任何字符,0 到 N 次出现,但不贪心,? char
    • (?=,) = 查找, char 是一个积极的前瞻性断言

    【讨论】:

    • 请注意,-P 是一个 gnu 标志,在大多数非 Linux 系统上不可用,例如Mac 和其他 BSD。
    • 是的,但是 OP 有 linux 标签 ;)
    • 无论如何,添加了一个更便携的perl 解决方案。
    • 谢谢 sputnick,这行得通。只是为了理解它是 'VOL\.\K.*?(?=,)' 正则表达式?因为我试图使这个表达式没有成功: (?
    【解决方案2】:

    这可以使用 bash 的内置正则表达式匹配来完成:

    if [[ "$var" =~ "VOL. "([^,]*)"," ]]; then
        match="${BASH_REMATCH[1]}"
    fi
    

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2013-05-28
      相关资源
      最近更新 更多