【问题标题】:Replace character after file name string variable in bash在bash中替换文件名字符串变量后的字符
【发布时间】:2019-03-28 06:51:24
【问题描述】:

我在 bash 中有如下字符串:

string=P001_WA05_1_i5-_i7-SI_GA_A5_1_S1_*_

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

这个字符串的期望输出是P001_WA05*i5-_i7-SI_GA_A5_*_*_

如何做到这一点?我在正则表达式中包含了上述格式,但我不确定如何用星号替换指示模式之后的指示值。

谢谢, 杰克

【问题讨论】:

  • $string 似乎与 WA[[:alpha:]]+([0-9]) 模式不匹配,因为“WA”后面没有跟字符串中的字母字符。
  • @tshiono 抱歉,已更正 - 它应该是 W[[:alpha:]]...
  • 嗯..应该是W[[:alpha:]][0-9]+吧?
  • @tshiono 这可能是正确的,我对正则表达式不太擅长。我的意思是 W[[:alpha:]]+([0-9]) 但也许 W[[:alpha:]][0-9]+ 是正确的。本质上,我想要 W 加上一个 alpha 字符和多个数字。

标签: regex bash


【解决方案1】:

您可以通过${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_等等。
然后,您可以将这些子字符串与您的替换字符串连接起来:“*”。
希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2020-12-21
    • 2015-01-29
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多