【问题标题】:Strip a part of string in linux在 linux 中删除字符串的一部分
【发布时间】:2022-12-11 14:22:23
【问题描述】:

Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 是我的字符串,我想要的结果是 vm-1.0.3

做这个的最好方式是什么

下面是我试过的

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | awk -F - {'print $1,$2'}

虚拟机 1.0.3

我也试过

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | awk -F - {'print $1"-",$2'}

虚拟机- 1.0.3

在这里我不需要中间的空间

我尝试使用 cut 并得到了预期的结果

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | cut -c 1-8

vm-1.0.3

最好的方法是什么?

【问题讨论】:

  • 我们偶尔会在脚本主体中看到脚本分隔符 (') - {'...'} 而不是 '{...}'。您从哪里得到这样做的想法 - 是否有书籍或教程建议这样做?它也是几天前在unix.stackexchange.com/q/727086/133219 上出现的,但每次我问它来自哪里时,我都得不到答案——令人沮丧!

标签: linux unix awk


【解决方案1】:

这是我能想到的最简单的:

echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | cut -c 25-32

显然,您需要确定角色的位置。最重要的是,您似乎有两个分隔符:“_”和“-”,而这两个字符也是您条目名称的一部分。

【讨论】:

    【解决方案2】:

    从您提供的第一个示例中假设您的输入的一般形式是什么,以便它可以使用任何 sed 稳健地处理:

    $ echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
        sed 's/^[^-]*-[^-]*-[^_]*_(.*)-[^-]*$//'
    vm-1.0.3
    

    或任何 awk:

    $ echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
        awk 'sub(/^[^-]+-[^-]+-[^_]+_/,"") && sub(/-[^-]+$/,"")'
    vm-1.0.3
    

    【讨论】:

      【解决方案3】:

      您不需要 2 次调用 awk,但是您的语法在 curly 之外使用单引号,包括打印连字符:

      echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | 
        awk -F_ '{print $2}' | awk -F- '{print $1 "-" $2}'
      

      如果您的字符串具有相同的格式,请将字段分隔符设为 -_

      echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F"[-_]" '{print $4 "-" $5}'
      

      或者在- 上拆分第二个字段并打印前两部分

      echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F_ '{
        split($2,a,"-")
        print a[1] "-" a[2]
      }'
      

      或者使用 gnu-awk 与捕获组进行更具体的匹配:

      echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | 
        awk 'match($0, /^Apps-[^_]*_(vm-[0-9]+.[0-9]+.[0-9]+)/, a) {print a[1]}'
      

      输出

      vm-1.0.3
      

      【讨论】:

        【解决方案4】:
        echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' | sed -E 's/^.*_vm-([0-9]+).([0-9]+).([0-9]+)-.*/vm-../'
        

        【讨论】:

          【解决方案5】:
          echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
          sed -E 's/^.*_vm-([0-9]+).([0-9]+).([0-9]+)-.*/vm-../'
          

          【讨论】:

            【解决方案6】:

            这就是我想出的。最好使用单个程序而不是同时运行两个不同的程序

            echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | cut -c 25-32
            

            【讨论】:

            猜你喜欢
            • 2012-03-31
            • 1970-01-01
            • 2017-05-11
            • 2018-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多