从字符串中捕获第二个字段和最后一个字段

从字符串中捕获第二个字段和最后一个字段

我们有具有以下文件名格式的文件

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"}'

相关内容