如何在Linux Bash的sed命令中正确使用变量?
问题解决:sed中使用变量匹配正则的错误修正
你的问题出在sed正则的解析上,原命令里的正则没有被正确识别,导致替换逻辑失效。
错误原因
原脚本存在两个核心问题:
- 若使用BSD sed(比如macOS自带版本),基础正则模式不支持
\|作为“或”运算符,必须启用扩展正则才能用|实现多选项匹配。 - 原命令用双引号包裹sed脚本时,bash对正则里的转义字符处理会干扰sed解析,导致括号和“或”运算符未被正确识别。
正确解决方案
方案1:使用扩展正则(推荐,语法更简洁)
修改变量定义,去掉|前的转义符,给sed添加-E选项启用扩展正则模式:
adjectives="delicious|gross|bearable|yummy" sed -E "s/($adjectives)\.//g" input.txt > output.txt
方案2:保留基础正则,修正bash解析问题
用单引号包裹sed的正则模板,仅在变量部分使用双引号,避免bash干扰转义字符的传递:
adjectives="delicious\|gross\|bearable\|yummy" sed 's/\('"$adjectives"'\)\.//g' input.txt > output.txt
执行任意一种方案后,output.txt都会得到期望结果:
banana apple
内容的提问来源于stack exchange,提问作者JohnFreeman1212
相关产品推荐
相关产品推荐

