在bash

时间:2018-10-23 23:30:48

标签: regex bash

我在bash中有一个类似于以下内容的字符串:

string=P001_WA05_1_i5-_i7-SI_GA_A5_1_S1_*_

我想用星号替换_[0-9]_之后的W[[:alpha:]]+([0-9]),并用星号替换[0-9]_[[:alpha:]][0-9]之后的SI_GA_[[:alpha:]]+([0-9])

此字符串的期望输出为P001_WA05*i5-_i7-SI_GA_A5_*_*_

这怎么办?我在正则表达式中包含了上述格式,但是我不确定如何在显示的模式后用星号替换显示的值。

谢谢, 杰克

1 个答案:

答案 0 :(得分:0)

您可以通过${BASH_REMATCH[1]}等重用括号包围的匹配模式作为后向引用。然后您可以说:

string=P001_WA05_1_i5-_i7-SI_GA_A5_1_S1_*_
if [[ $string =~ (.*W[[:alpha:]][0-9]+)_[0-9]_(.*SI_GA_[[:alpha:]]+[0-9]_)[0-9]_[[:alpha:]][0-9](.*)  ]]; then
    string="${BASH_REMATCH[1]}*${BASH_REMATCH[2]}*${BASH_REMATCH[3]}"
fi
echo "$string"

第一个子模式.*W[[:alpha:]][0-9]+P001_WA05匹配,第二个子模式.*SI_GA_[[:alpha:]]+[0-9]_SI_GA_A5_匹配,依此类推。
然后,您可以将这些子字符串与替换字符串连接起来:“ *”。
希望这会有所帮助。