【问题标题】:sed extract part of string from a filesed 从文件中提取部分字符串
【发布时间】:2022-01-08 02:57:06
【问题描述】:

我一直在尝试从如下所示的文件中仅提取部分字符串:

str1=USER_NAME
str2=justAstring
str3=https://product.org/v-4.5-bin.zip
str4=USER_HOME

我只需要提取版本 - 在这种情况下:4.5

我是通过 grep 然后 sed 完成的,但现在输出是 4.5-bin.zip

-> grep str3 file.txt
str3=https://product.org/v-4.5-bin.zip
-> echo str3=https://product.org/v-4.5-bin.zip | sed -n "s/^.*v-\(\S*\)/\1/p"
4.5-bin.zip

我应该怎么做才能在最后删除-bin.zip? 谢谢。

【问题讨论】:

    标签: bash sed grep


    【解决方案1】:

    第一种解决方案:使用您显示的示例,请尝试遵循sed 代码。

    sed -n '/^str3=/s/.*-\([^-]*\)-.*/\1/p' Input_file
    

    说明:使用sed-n 选项,默认情况下会停止打印值,只打印匹配的部分。在主程序检查条件中,如果行从str3= 开始,则在那里执行替换。代替捕获捕获组中第一个 - 和下一个 - 之间的所有内容,并使用 \1 替换整行并仅使用 p 选项打印匹配的部分。



    第二个解决方案:使用 GNU grep 您可以尝试遵循 grep 程序。

    grep -oP '^str3=.*?-\K([^-]*)' Input_file
    


    第三种解决方案:使用awk 程序根据显示的示例获取预期输出。

    awk -F'-' '/^str3=/{print $2}'  Input_file
    


    第 4 种解决方案: 使用 awkmatch 函数在使用设置一次的 RSTARTRLENGTH 变量的帮助下获得预期结果match 函数找到了一个 TRUE 匹配项。

    awk 'match($0,/^str3=.*-/){split(substr($0,RSTART,RLENGTH),arr,"-");print arr[2]}'  Input_file
    

    【讨论】:

      【解决方案2】:

      如果您知道版本仅包含数字和点,请将 \S 替换为 [0-9.]。此外,匹配捕获组之外的剩余字符以将其删除。

      sed -n 's/^.*v-\([0-9.]*\).*/\1/p'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2012-07-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多