转换动态字母数字字符串

时间:2019-08-12 09:20:52

标签: regex bash

我有一个名为700-I20190808-0201的内部版本。我需要将其转换为7.0.0-I20190808-0201。我可以使用正则表达式来做到这一点:

sed 's/\([0-9]\)\([0-9]\)\([0-9]\)\(.\)/\1.\2.\3\4/' abc.txt

但是,当内部版本ID为7001-I20190809-0201时,该解决方案不起作用。我们能否使正则表达式动态化,使其同时适用于700和7001?

4 个答案:

答案 0 :(得分:1)

请您尝试以下。

awk 'BEGIN{FS=OFS="-"}{gsub(/[0-9]/,"&.",$1);sub(/\.$/,"",$1)} 1' Input_file

答案 1 :(得分:1)

如果您有Perl可用,那么前瞻正则表达式将使这一过程变得简单:

$ cat foo.txt
700-I20190808-0201
7001-I20190809-0201
$ perl -ple 's/(\d)(?=\d+\-I)/\1./g' foo.txt
7.0.0-I20190808-0201
7.0.0.1-I20190809-0201

答案 2 :(得分:1)

您可以使用标签和使用sed的分支实现简单的循环:

$ echo '7001-I20190809-0201' | sed ':1; s/^\([0-9]\{1,\}\)\([0-9][-.]\)/\1.\2/; t1'
7.0.0.1-I20190809-0201
$ echo '700-I20190809-0201' | sed ':1; s/^\([0-9]\{1,\}\)\([0-9][-.]\)/\1.\2/; t1'
7.0.0-I20190809-0201

如果您的sed支持-E标志:

sed -E ':1; s/^([0-9]+)([0-9][-.])/\1.\2/; t1'

答案 3 :(得分:-1)

sed -e 's/\([0-9]\)\([0-9]\)\([0-9]\)\(.\)/\1.\2.\3.\4/' -e 's/\.\-/\-/' abc.txt 

这对我有用,非常简单。只需使用replaceregex模式将其提取到我的ant脚本中