sed处理替换字符中的特殊字符

  • A+
所属分类:Linux
1.简介

Stream EDitor:流编,sed 是一种在线的、非交互式的编辑器,它一次处理一 行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往 屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除 非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的 反复操作。

2.格式

1)sed 选项 命令 文件

2)sed 选项 –f 脚本 文件

3.返回值

不报错返回均为0,无论查询的是否存在,例如把文件里的a全部换成b,但文件内容里没有a,所以输出内容为文件原本内容,返回值0。

4.sed与正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字 符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。

1)使用基本元字符集 ^, $, ., *, [], [^], < >,(),{}

2)使用扩展元字符集 ?, +, |, ( )

3)使用扩展元字符的方式:

+     //转义

sed -r    //加-r

5.参数

删除:d

替换:s

读取:r

写入:w
相当于另存为:

追加:a

插入:i

取反:!

多重命令:e

替换整行:c

获取下一条:n

6.暂存空间

1)图示

sed处理替换字符中的特殊字符

2)暂存和取用命令
h覆盖暂存空间,H追加暂存空间,g覆盖行,G追加行

3)示例

 

文本文件1.txt中包含字符串[:50]

愿意想将[:50]替换为[50:100],脚本如下:

运行./test.sh,结果没有输出

于是,我上网查找问题原因,
1,如何在sed里使用变量的问题,发现原来是双引号和单引号引用的区别。

单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式
下面是个简单的例子

 

网上总结了四种方案

1.       eval sed 's/$a/$b/' filename

2.       sed "s/$a/$b/" filename

3.       sed 's/'$a'/'$b'/' filename

4.       sed s/$a/$b/ filename

于是我将脚本中sed中的单引号改为双引号。

但是输出的结果却跟预想的不一样。结果如下:

仔细一下,应该跟sed中的正则表达式有关:
正则表达式认可的特殊字符有:

. * [ ] ^ $ { } \ + ? | ( )

这些特殊字符中的一个作为文本字符,需要在特殊字符前添加反斜杠字符\ 来转义它。

得到之前的结果是因为sed中的正则表达式[:50]表示第一个匹配: , 5,0任一字符用[50:100]进行替换。字符串[:50]第一个匹配的是:,所以得到[[50:100]50].所以我将oldstr中的[]进行转义,并且在sed命令选项中加上g进行完全替换。

则得到我想要的结果:

问题解决完毕。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: