Linux下从qcow2文件名提取vm-1.0.3的最优字符串截取方法
问题:从指定字符串提取
vm-1.0.3的最优方法 目标字符串为Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2,需要从中提取出vm-1.0.3。尝试过多种awk命令但输出存在多余空格,用cut固定字符截取得到了预期结果,但希望找到更通用、更优的实现方法。
以下是尝试过的命令及对应输出:
$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | awk -F - {'print $1,$2'}
输出: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'}
输出:vm- 1.0.3
$ 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
最优实现方法
推荐以下几种通用且高效的方法,避免cut硬编码字符长度的局限性(当版本号格式变化时,比如vm-1.0.10,固定长度截取会失效):
1. 单次awk处理(多分隔符)
通过指定_和-作为分隔符,直接定位需要的字段并拼接:
echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | awk -F '[_-]' '{print $6 "-" $7}'
2. awk正则匹配(更通用)
利用awk的正则匹配功能,直接提取符合格式的目标字符串:
echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | awk '{match($0, /vm-[0-9]+\.[0-9]+\.[0-9]+/, res); print res[0]}'
3. sed正则捕获
通过sed的替换功能,捕获目标组并输出:
echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | sed -n 's/.*_\(vm-[0-9]*\.[0-9]*\.[0-9]*\)-.*/\1/p'
4. grep PCRE匹配(简洁直观)
如果grep支持PCRE(Perl兼容正则表达式),可以直接提取匹配的内容:
echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | grep -oP 'vm-\d+\.\d+\.\d+'
内容的提问来源于stack exchange,提问作者Prithviraj
相关产品推荐
相关产品推荐

