我们有具有以下文件名格式的文件
VER_{文件名}_{版本}
例子
VER_collect_important_info.pl_1.0.2
我们只想捕获“文件名”和“版本”号
那么如何删除文件名中的第一个 _ 和最后一个 _ ,以便我们可以捕获“文件名”和“版本”(使用 sed/awk 或 perl one-liner )
例子
echo VER_collect_important_info.pl_1.0.2 | <some syntax>
collect_important_info.pl 1.0.2
答案1
Perl 对我来说比轻量级的替代品更自然:
echo VER_collect_important_info.pl_1.0.2 | perl -pe 's/^[^_]*_(.*)_(.*)$/$1 $2/'
如果这使用比必要的更重的重量过程并不重要,我会停在那里。
sed 可以做到这一点,但是,必须转义括号等基本元素感觉很麻烦:
echo VER_collect_important_info.pl_1.0.2 | sed 's/VER_\(.*\)_\(.*\)/\1 \2/'
答案2
这应该可以解决问题
$ echo VER_collect_important_info.pl_1.0.2 | sed 's/_/ /' | sed -r 's/(.*)_/\1 /' | awk -F" " '{print $2"\t"$3}'
第一个 sed 替换第一次出现的_
,第二次 sed 替换最后一次出现的_
,最后用 awk 打印
答案3
$ echo 'VER_collect_important_info.pl_1.0.2' |
perl -F_ -lane 'print join("_", @F[1..@F-2]), " ", @F[@F-1]'
collect_important_info.pl 1.0.2
注意:perl
数组从 0 开始,而不是 1,因此第二个字段的数组索引是[1]
,而不是[2]
。
这会将输入拆分为一个数组 ( ),并用下划线字符@F
分隔。_
然后,它打印第 2 个字段到倒数第 2 个字段 ( @F[1..@F-2]
),并用下划线连接,后跟一个空格,然后是最后一个字段 ( @F[@F-1]
)。
答案4
通过 awk,您可以使用:
echo VER_collect_important_info.pl_1.0.2 | awk -F '_' '{for (i=2; i<NF; i++) {{printf $i} if (i!=NF-1) printf "_"} printf " " $NF "\n"}'