如何在Bash中移除字符串变量中的-c参数及对应值
解决Bash中移除特定选项及其参数的问题
你的初始方法之所以出错,是因为${switches/ -c /}只替换了" -c "这个字符串片段,完全没处理-c后面跟着的参数,导致cc和1,2,3,4被生硬地连在了一起。咱们用Bash原生功能来精准解决这个问题:
方法1:用Bash正则匹配提取(最可靠)
Bash 3.2及以上版本支持正则表达式匹配,我们可以精准定位-c及其合法参数(1、2或4个逗号分隔的整数),然后重新拼接字符串:
switches="-r cc -c 1,2,3,4 -u" # 用正则匹配拆分字符串 if [[ $switches =~ (.*)(^| )-c ([0-9]+(,[0-9]+){0,1}|[0-9]+(,[0-9]+){3})( |$)(.*) ]]; then # 拼接匹配到的前后部分,跳过-c和参数 switches="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[5]}" # 清理可能的多余空格(开头、结尾、中间多空格) switches=$(echo "$switches" | xargs) fi echo "$switches" # 输出:-r cc -u
方法2:全局参数替换(更简洁)
利用Bash的全局替换功能,直接把-c和对应参数替换为空,再清理空格:
switches="-r cc -c 1,2,3,4 -u" # 全局替换匹配-c及合法参数的部分 switches=${switches//(^| )-c ([0-9]+(,[0-9]+){0,1}|[0-9]+(,[0-9]+){3})( |$)/} # 压缩中间多空格,再去掉首尾空格 switches=$(echo "$switches" | tr -s ' ') switches=${switches## }; switches=${switches%% } echo "$switches" # 输出:-r cc -u
正则表达式说明
咱们拆解一下用来匹配-c和参数的正则:
(^| ):匹配字符串开头或者-c前面的空格,确保-c是独立的选项-c:匹配选项本身和后面的空格([0-9]+(,[0-9]+){0,1}|[0-9]+(,[0-9]+){3}):精准匹配合法参数:[0-9]+(,[0-9]+){0,1}:对应1个或2个整数(0个逗号=1个数字,1个逗号=2个数字)[0-9]+(,[0-9]+){3}:对应4个整数(3个逗号分隔4个数字)
( |$):匹配参数后面的空格或者字符串结尾,避免误删其他内容
内容的提问来源于stack exchange,提问作者Pal Csanyi
相关产品推荐
相关产品推荐

