在linux中剥离字符串的一部分

thtygnil  于 2022-12-11  发布在  Linux
关注(0)|答案(4)|浏览(180)

我的字符串是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

虚拟机-1.0.3
做同样的事情的最好方法是什么?

deikduxw

deikduxw1#

从您提供的1个示例中假设输入的一般形式,以便使用任何sed:

$ echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
    sed 's/^[^-]*-[^-]*-[^_]*_\(.*\)-[^-]*$/\1/'
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
zfciruhq

zfciruhq2#

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

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
wi3ka0sx

wi3ka0sx3#

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

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

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

n3schb8v

n3schb8v4#

echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' | sed -E 's/^.*_vm-([0-9]+).([0-9]+).([0-9]+)-.*/vm-\1.\2.\3/'

相关问题