如何转义传入sed命令的变量中的特殊字符以避免执行报错
问题原因
你当前使用-作为sed替换命令s的分隔符,当变量中包含-时,sed会将变量内的-识别为替换命令的分隔符,提前截断替换规则,后续字符会被误判为替换标志位,因此抛出bad flag错误。
修复方案
方案1:更换分隔符(最简便)
选择一个不会出现在变量值中的字符作为分隔符即可,常用的可选字符有|、#、@、%等。
以|作为分隔符为例,修改后的命令如下:
# 原报错写法 # sed "s-\t-&${VARIABLE}/-" # 修改后写法 sed "s|\t|&${VARIABLE}/|"
你给出的测试用例可直接用该方案正常运行:
VARIABLE="test-variable" sed "s|\t|&${VARIABLE}/|"
方案2:转义变量中的分隔符
如果你必须使用-作为分隔符,可以提前对变量内的-做转义处理:
VARIABLE="test-variable" # 转义变量中的短横线 ESCAPED_VAR=$(sed 's/-/\\-/g' <<< "$VARIABLE") sed "s-\t-&${ESCAPED_VAR}/-"
方案3:通用特殊字符转义(适配变量含任意特殊字符场景)
如果变量可能包含/、\、&等sed特殊元字符,可以先对变量做全量转义,再传入sed命令(以下示例仍用|作为分隔符):
VARIABLE="test-variable/含&特殊符" # 转义所有sed替换段特殊字符:\、&、分隔符| ESCAPED_VAR=$(sed 's/[|&\]/\\&/g' <<< "$VARIABLE") sed "s|\t|&${ESCAPED_VAR}/|"
内容的提问来源于stack exchange,提问作者chriz
相关产品推荐
相关产品推荐

