本文记录了作者在使用sed
命令进行文本替换时,对于使用到的替换模式进行转义处理使用到的sed
命令,简单来说:
- 使用
sed -e 's/[]\/$*.^[]/\\&/g'
即可对输入字符串进行转义
场景
sed
命令常常被用来对文本做处理,其中一个最经常用到的处理就是替换,替换的语法如下:
1 | echo $STRING | sed -e 's/<match_pattern>/<replace_pattern>/g' |
当然也可以有其他的变化,不过这是作者使用的最多的方式。
在使用这些的时候,我们可能会在match_pattern
和replace_pattern
中引用变量,已达到分别管理和增强可读性的目的,比如
1 | # dummy text |
但是,如果上面引用的REPLACE
里面有特殊字符,我们就会遇到问题,比如
1 | # dummy text |
我们的本意是将a
替换为/a
,但是,使用这几条命令,会得到
1 | sed: 1: "s/a//a/g |
这里的原因就是/a
中的/
是一个特殊字符,如果希望得到我们上述的效果,应该这么操作
1 | # dummy text |
我们通过\/
进行转义,取得了成功,但是这种方式使得我们编写replace_pattern
变得麻烦,而且很不直观,我们希望有一个函数来达到如下效果
1 | # dummy text |
也就是说,编写replace_pattern
时,可以直接编写,而后使用一个函数或者命令自动转义再使用
解决方案
使用sed -e 's/[]\/$*.^[]/\\&/g'
即可
方案解析
我们这次的方案就是对原生的replace_pattern
做一次替换:
match_pattern
为[]\/$*.^[]
- 这个正则表达式的结构很具有迷惑性,其实它是一个大的bracket group
- 也就是说,实际上是
[
]\/$*.^[
]
的结构 - 意味着匹配
]\/$*.^[
中的任一字符
replace_pattern
为\\&
- 这个
replace_pattern
用到了一个转义字符和一个特殊字符 - 转义字符
\\
表示的就是\
- 特殊字符
&
表示的是match_pattern
匹配到的内容
- 这个
综合起来,这个替换语句就是把]\/$*.^[
前面全部加上一个斜杠,进行转义