RegEx:如何提取某个部分并对其进行修改?

时间:2017-06-15 00:29:11

标签: regex

我想提取字符串的某个部分并使用正则表达式对其进行修改。

给定字符串为TestcaseVzwPerformance_8_2_1_4_1_FDD2。 我想从字符串中提取部分8_2_1_4_1,然后用点_替换下划线.,因此预期结果必须为8.2.1.4.1

给定字符串的数量和长度可以不同。 例如,

Given string                        // Expected result
TestcaseVzwCqi_3_9_Test2            // 3.9
TestcaseVzwSvd1xRttAclr_6_6_2_3     // 6.6.2.3
TestcaseVzwCsiFading_9_4_1_1_1_FDD4 // 9.4.1.1.1

这是我的RegEx:

((?:\D{0,}_)(\d(_\d)*)(.*))

编号的捕获组 - $2 - 包含8_2_1_4_1但带有下划线。 我可以用点替换下划线吗?

需要在一个RegEx和一个替换中完成。

2 个答案:

答案 0 :(得分:0)

正则表达式无法修改,例如使用sed

echo TestcaseVzwPerformance_8_2_1_4_1_FDD2 | 
sed -E 's/[^_]*_(([_0-9])+)_.*/\1/;s/_/./g'         

8.2.1.4.1         

答案 1 :(得分:0)

如果你有一个Bash字符串,你可以使用Bash正则表达式来捕获和Bash参数扩展来替换:

$ s="TestcaseVzwSvd1xRttAclr_6_6_2_3"
$ [[ $s =~ ^[^_]*_([[:digit:]_]+)_* ]] && tmp=${BASH_REMATCH[1]//_/.} && echo "${tmp%.}"
6.6.2.3

可以循环:

while read -r line; do 
   if [[ $line =~ ^[^_]*_([[:digit:]_]+)_* ]]; then 
      tmp=${BASH_REMATCH[1]//_/.}
      echo "\"$line\" => ${tmp%.}"
   fi   
done <<< 'Given string                      
TestcaseVzwCqi_3_9_Test2            
TestcaseVzwSvd1xRttAclr_6_6_2_3     
TestcaseVzwCsiFading_9_4_1_1_1_FDD4' 

打印:

"TestcaseVzwCqi_3_9_Test2" => 3.9
"TestcaseVzwSvd1xRttAclr_6_6_2_3" => 6.6.2.3
"TestcaseVzwCsiFading_9_4_1_1_1_FDD4" => 9.4.1.1.1

您可以使用相同的循环来处理文件。

如果您有文件,也可以使用gawk

$ awk 'BEGIN{FPAT="_[[:digit:]_]+"} 
      /_[[:digit:]]/ {sub(/^_/,"", $1); sub(/_$/,"",$1); gsub(/_/,".",$1); print $1}' file
3.9
6.6.2.3
9.4.1.1.1