如何使用sed在bash脚本的括号内添加单引号?
用sed给括号内内容添加单引号的解决方案
没问题,这事儿用sed完全能搞定!我给你两个实用的命令,再拆解下语法细节,保证你能直接套用。
核心命令(两种写法)
写法1:基本正则表达式(兼容所有sed版本)
如果你的系统是Linux或者默认使用GNU sed,直接用这个命令处理文本:
sed "s/\(\([^)]*\)\)/('\1')/g" your_input.txt
要是需要直接修改bash脚本文件(原地替换),加上-i参数:
sed -i "s/\(\([^)]*\)\)/('\1')/g" your_script.sh
Mac用户注意:Mac的sed是BSD版本,-i后面需要加空字符串参数:
sed -i "" "s/\(\([^)]*\)\)/('\1')/g" your_script.sh
写法2:扩展正则表达式(更简洁)
用-E选项开启扩展正则,语法更直观,不用转义捕获组的括号:
sed -E "s/([^)]*)/('\1')/g" your_input.txt
原地修改文件的版本:
sed -i -E "s/([^)]*)/('\1')/g" your_script.sh # Mac用户:sed -i "" -E "s/([^)]*)/('\1')/g" your_script.sh
效果演示
比如输入字符串:
MYSTRING(FOO_1234_BAR)
执行命令后会输出:
MYSTRING('FOO_1234_BAR')
语法拆解
拿扩展正则的写法来解释,更易懂:
s/.../.../g:sed的替换命令,g表示全局替换(如果一行有多个括号对,都会被处理)([^)]*):正则匹配部分,其中:(和):这里是扩展正则的捕获组标记,用来抓取括号里的内容[^)]*:匹配除了右括号)之外的任意字符,刚好对应括号内的内容
('\1'):替换后的内容,\1代表刚才捕获的括号内的内容,我们给它前后加上单引号,再用括号包裹,就得到了('XXX')的格式
注意事项
- 如果你的括号内包含特殊字符(比如空格、感叹号),
[^)]*依然能正常工作,因为它只排除右括号 - 如果脚本里有嵌套括号(比如
A(B(C))),这个正则只会处理最外层的括号对,要是需要处理嵌套场景,得用更复杂的正则,但一般业务场景下这个命令足够用了
内容的提问来源于stack exchange,提问作者MABeatty1978
相关产品推荐
相关产品推荐

