BASH正则表达式语法,用于替换子字符串

时间:2019-04-16 11:31:25

标签: bash

我正在bash中工作,我想从字符串中删除子字符串,我使用grep检测字符串,并且可以按我的要求工作,如果条件为真,我可以在其他工具中对其进行测试,然后选择正是我想要的字符串元素。

要从字符串中删除元素,我遇到了困难。

我想删除“:系列1”之类的内容,其中可能会有不同的数字,包括0填充,小写s或多余的空格。

temp ='测试:这是一个测试:系列1'

    echo "A. "$temp
    if echo "$temp" | grep -q -i ":[ ]*[S|s]eries[ ]*[0-9]*" && [ "$temp" != "" ]; then
        title=$temp
        echo "B. "$title
        temp=${title//:[ ]*[S|s]eries[ ]*[0-9]*/ }
        echo "C. "$temp
    fi
    # I trim temp for spaces here
    series_title=${temp// /_}   
    echo "D. "$series_title

我的问题是在C和D点

给我: C.测试 D.测试_

1 个答案:

答案 0 :(得分:2)

您可以单独从bash执行正则表达式匹配,而无需使用外部工具。

不清楚您的要求是什么。但是从您的代码来看,我想下面的方法会有所帮助。

temp='Testing: This is a test: Series 1'

# Following will do a regex match and extract necessary parts
# i.e. extract everything before `:` if the entire pattern is matched
[[ $temp =~ (.*):\ *[Ss]eries\ *[0-9]* ]] || { echo "regex match failed"; exit; }

# now you can use the extracted groups as follows    
echo "${BASH_REMATCH[1]}"    # Output = Testing: This is a test

如评论中所述,如果您需要在被删除的部分之前和之后提取零件,

temp='Testing: This is a test: Series 1 <keep this>'
[[ $temp =~ (.*):\ *[Ss]eries\ *[0-9]*\ *(.*) ]] || { echo "invalid"; exit; }
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"  # Output = Testing: This is a test <keep this>

请记住,[0-9]*也将匹配零个长度。如果需要强制至少有一位数字,请改用[0-9]+<space here>*(即零个或多个空格)和其他空格也是如此。