【原创】sed 命令替换文本时忽略转义字符
概要
1、简介
sed 是 Linux/Unix 下处理文本的神器。一般情况下,sed 进行文本(字符)替换默认就支持了正则,这确实能为我们在很多时候带来巨大方便。
但有时候也可能遇到一些小麻烦。比如,我们要替换的字符串中本身包含了正则表达式的元字符(关键字符/保留字符,有正则的语义的字符,比如 ./*/?/^ 等)。
有的人可能会说了,直接对元字符进行转义就行了。没错,这是一种很好的解决方法。
但是这种方法有几个小问题:
一是命令的可读性差,一大堆的符号让人眼花缭乱。
二是如果是一个较长的字符串,包含的元字条较多,也比较麻烦。
三是有的人可能不太熟悉正则表达式,那么 TA 不一定能看懂也能写的出来。
所以,下面介绍一个简单的小方法,把包含正则元字符的的字符串当作一个整体进行替换
2、环境
-
Ubuntu 18.04.5
-
Bash shell 4.4.20
正文
1、测试文本
准备一个测试文件 sed-test.txt,内容如下:
$ cat sed-test.txt
title="This is a test file"
description="This is a testing file for sed command"
url="https://www.baidu.com"
2、测试过程
正常情况,如果我们要使用 sed 将 https 替换成 http,方法有很多,如下
$ sed -in 's/https/http/g' sed-test.txt
$
$ cat sed-test.txt
title="This is a test file"
description="This is a testing file for sed command"
url="http://www.baidu.com"
如果需要将 https://www.baidu.com 换成 http://abc.jiangzhuolin.cn 这样呢。
我们先试试直接写两个 URL,发现不行。
$ sed -in 's/https://www.baidu.com/http://abc.jiangzhuolin.cn/g' sed-test.txt
sed: couldn't open file ww.baidu.com/http://abc.jiangzhuolin.cn/g: No such file or directory
但我们把上面的命令改成下面这样
% sed -i 's$https://www.baidu.com$http://abc.jiangzhuolin.cn$g' sed-test.txt
然后发现更新成功了
$ cat sed-test.txt
title="This is a test file"
description="This is a testing file for sed command"
url="http://abc.jiangzhuolin.cn"
这个测试用例的实现方法当然还有很多种,这里只是作一个示例,其他实现方式此处不再赘述。
总结
我们发现上面的两次命令并没有多少变化,只是将三处 / 改成了 $ 就生效了,这是为什么呢?
sed s 命令格式如下:
s/regexp/replacement/flags
常用命令如下
sed -i 's/orign_str/replaced_str/g' file_name
默认情况下,s 命令的字符串间的分隔符是 /,但上面的情况来看,我们要替换的文本中也包含了 / 符号,所以肯定会引起混淆了。
但是强大的 sed 支持自定义分隔符。于是,我们可以自已定义一个与我们替换文本不冲突或不重合的分隔符。这样,两个分隔符中间的字符串就不会因为语义歧义而报错或者替换出错。
官网原话:
附录
参考
1、sed 首页
http://www.gnu.org/software/sed
2、sed 官网文档
http://www.gnu.org/software/sed/manual/sed.html
3、s command 文档
http://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command
近期评论