我想提取字符串的某个部分并使用正则表达式对其进行修改。
给定字符串为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和一个替换中完成。
答案 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