我正在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.测试_
答案 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>*
(即零个或多个空格)和其他空格也是如此。