代码之家  ›  专栏  ›  技术社区  ›  ShaneF

linux sed错误,前面的正则表达式无效

  •  0
  • ShaneF  · 技术社区  · 2 年前

    我正试图从试运行阶段的语义发布中解析两个字符串。我创建了一个Regex,在上进行了测试 https://regex101.com ,它有效。不过,当我试图将其转换为sed格式时,它失败了。

    试了一整天,没有成功。帮助会很好。

    这些是练习字符串:

    Found git tag v6.0.0 associated with version 6.0.0 on branch main
    Found git tag v6.0.0 associated with version 6.0.0-main.2 on branch main
    The next release version is 7.0.0
    The next release version is 7.0.0-main.12
    

    我试图得到的结果是:

    6.0.0
    6.0.0-main.2
    7.0.0
    7.0.0-main.12
    

    这是我的正则表达式:

    .*(([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([a-zA-Z-[0-9]+\.]*)\+?([a-zA-Z-([0-9]+))?).*
    

    这是我在工作流程中遇到的错误:

    Run export PREV_TAG_VERSION=$(npm run semantic-release:dry-run | grep 'associated with version' | sed -E 's/.*((\[0-9\]+)\.(\[0-9\]+)\.(\[0-9\]+)(?:-([a-zA-Z-\[0-9\]+\.]*)\+?([a-zA-Z-(\[0-9\]+))?).*/\1/')
    ##[debug]/usr/bin/bash -e /home/runner/work/_temp/8b831bec-863f-48d0-84dc-028e0fa78e8f.sh
    sed: -e expression #1, char 96: Invalid preceding regular expression
    grep: write error: Broken pipe
    sed: -e expression #1, char 96: Invalid preceding regular expression
    grep: write error: Broken pipe
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   Nick SamSmith1986    2 年前

    考虑到您正在使用 sed 要扔掉行中所有不匹配的部分,您可以使用 grep 与 -o 选项根据您的输入数据判断,您可以将正则表达式简化为:

    \b([0-9]+\.){2}[0-9]+\S*
    

    其匹配:

    • \b :断字
    • ([0-9]+\.){2} :2个数字后面跟一个 .
    • [0-9]+ :一些数字
    • \S* :0个或多个非空白字符

    Regex演示在 regex101

    与grep一起使用:

    grep -Eo '\b([0-9]+\.){2}[0-9]+\S*' tmp.txt
    

    输出:

    6.0.0
    6.0.0-main.2
    7.0.0
    7.0.0-main.12
    

    或者与 sed :

    sed -E 's/.*\b(([0-9]+\.){2}[0-9]+\S*).*/\1/' tmp.txt
    

    输出相同

        2
  •  1
  •   Ed Morton    2 年前

    regex101.com将证明regexp可以在regex101..com中工作,但这并不意味着它可以在任何其他工具中工作。特别是,您尝试使用的regexp是PCRE(例如。 (?:... )而sed默认支持BRE,一些sed在使用调用时支持ERE -E ,但没有Sed支持PCRE。

    还要记住 this saying 如果您发现自己正在编写一个长regexp:

    有些人在遇到问题时会想“我知道,我会用 正则表达式。“现在他们有两个问题。

    试试这个:

    $ awk '{print (/main$/ ? $(NF-3) : $NF)}' file
    6.0.0
    6.0.0-main.2
    7.0.0
    7.0.0-main.12