Linux中用SED从VAR_ONE移除VAR_TWO内容并赋值新变量报错,求解决方案
问题与解决思路
问题场景
我有两个变量,输出如下:
echo $VAR_ONE 'https://url_one','https://url_two' echo $VAR_TWO 'https://url_two'
尝试从$VAR_ONE中移除$VAR_TWO的内容并赋值给新变量时,执行以下命令报错:
VAR_THREE=$(echo $VAR_ONE | sed s/"$VAR_TWO"//) sed: bad option in substitution expression
写入脚本后仍报相同错误:
#!/bin/bash VAR_ONE=$(echo "'https://url_one','https://url_two'") VAR_TWO=$(echo "'https://url_two'") VAR_THREE=$(echo $VAR_ONE | sed s/"$VAR_TWO"//)
错误原因
sed默认用/作为替换命令的分隔符,而$VAR_TWO里的URL包含多个/,这会让sed误判分隔符的位置,导致语法解析出错。
解决方法
方案1:更换sed的分隔符
选择URL中不存在的字符(比如#)作为分隔符,避免冲突:
#!/bin/bash VAR_ONE="'https://url_one','https://url_two'" VAR_TWO="'https://url_two'" VAR_THREE=$(echo "$VAR_ONE" | sed "s#$VAR_TWO##") # 输出结果:'https://url_one', echo "$VAR_THREE"
注意给echo $VAR_ONE加上双引号,防止变量内容被shell拆分。
方案2:用bash内置字符串替换(推荐)
直接用bash的参数展开功能,无需调用外部命令,效率更高:
#!/bin/bash VAR_ONE="'https://url_one','https://url_two'" VAR_TWO="'https://url_two'" VAR_THREE="${VAR_ONE//$VAR_TWO/}" # 输出结果:'https://url_one', echo "$VAR_THREE"
${变量//匹配内容/替换内容}是bash的全局替换语法,这里替换内容为空就实现了删除效果。
方案3:转义特殊字符
如果一定要用/作为分隔符,需要先转义$VAR_TWO里的/:
#!/bin/bash VAR_ONE="'https://url_one','https://url_two'" VAR_TWO="'https://url_two'" # 转义VAR_TWO中的/ ESCAPED_VAR_TWO=$(echo "$VAR_TWO" | sed 's/\//\\\//g') VAR_THREE=$(echo "$VAR_ONE" | sed "s/$ESCAPED_VAR_TWO//") echo "$VAR_THREE"
这种方式步骤繁琐,一般不推荐。
内容的提问来源于stack exchange,提问作者Container-Man
相关产品推荐
相关产品推荐

