【原创】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

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注