前面章节,我们已经学习了够多的 sed 单字符命令,嗯,准确的说是单字母命令。
其实,sed 还另外支持两个特殊字符命令 等号(=) 和 合并连接符(&) 。
前面章节,我们已经学习了够多的 sed 单字符命令,嗯,准确的说是单字母命令。
其实,sed 还另外支持两个特殊字符命令 等号(=) 和 合并连接符(&)。
等号(=)命令我们在前一章节 sed 特殊字符命令 = 中学习啦。本章节我们来介绍另一个特殊字符 合并连接符(&) 。
& 命令
sed特殊字符命令 &,怎么说呢?
从它的字面解释 合并连接符 来看,就是把多个文本串在一起。
当然了,它不是这么简单,要是这么简单就好了。
它会在模式匹配成功后,将匹配成功的行根据模式进行分割,这样就存在三个部分的内容:模式之前的内容,模式匹配的内容,模式之后的内容。然后新的输出中,先输出 模式之前的内容,再输出 要替换的语句,并把要替换的语句中的 & 换成 模式匹配的内容,最后输出 模式之后的内容。
是不是有点复杂了?
我们举个例子,比如存在某行 我爱DDKK.COM 弟弟快看,程序员编程资料站。将模式设置为 /爱,那么就会把行的内容分割成
- 我
- 爱
- DDKK.COM 弟弟快看,程序员编程资料站
我是模式 /爱/ 之前的内容,爱 是模式 /爱/ 匹配的内容,DDKK.COM 弟弟快看,程序员编程资料站 是模式 /爱/ 之后的内容。
假设我们的替换语句是 &你,。 那么输出结果就是
我爱你,DDKK.COM 弟弟快看,程序员编程资料站
拼接的过程就是
1、 先输出模式之前的内容:我;
2、 再输出要替换的语句,并把要替换的语句中的&换成模式匹配的内容:&你,并用爱替换&,其实就是爱你,;
3、 最后输出模式之后的内容:DDKK.COM 弟弟快看,程序员编程资料站;
如果你还不懂,那个,多多练习找规律吧。
我们先来看语法。
特殊字符命令 & 通常与替换命令 s 一起使用。 语法格式一般如下
s/pattern/repalce_content_contain_&/
例如要把包行 李 的行 3) 小李,25岁,斯坦福大学 替换为 3) 小李,男,25岁,斯坦福大学,那么命令如下
s/李/&,男/
范例:将包含 李 的行在 李 之后插入 ,男
将包含李 的行在 李 之后插入 ,男
[www.ddkk.com]$ sed 's/李/&,男/' data.txt
运行结果如下
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,男,25岁,斯坦福大学
4) 小王,22岁,清华大学
哈哈,我突然找到一种新的解释 & 命令的方法。我们就举上面这个作为例子吧。
1、 sed先找到匹配模式的行,在上面这个范例中是3)小李,25岁,斯坦福大学;
2、 然后找到匹配的模式的内容,在上面的范例中是李;
3、 然后把匹配的模式的内容替换为新的字符串&,男,那么替换的结果就是3)小&,男,25岁,斯坦福大学;
4、 最后把&替换为匹配的内容,就是3)小李,男,25岁,斯坦福大学;
哈,是不是很简单啊。
范例2
因为接下来另一个范例的需要,这次我们改为查找数字,就是查找每行开头的那个表示行的数字,找到之后,就在数字前面添加 Line。
有了前面范例的铺垫,这个范例的代码想必就很简单了
[www.ddkk.com]$ sed 's/[[:digit:]]*/Line &/' data.txt
哦,对了,我们还没学模式中的正则,这个以后我们会学,现在,你只要知道 [[:digit:]] 用于查找单个数字即可
上面的sed 命令,结果你应该已经猜出来了吧
Line 1) 小明,23岁,北京大学
Line 2) 小红,22岁,清华大学
Line 3) 小李,25岁,斯坦福大学
Line 4) 小王,22岁,清华大学
范例3
在 范例2 中我们查找了每行开头的数字,对,就是行号。如果我们想查找第二个数字,就是那个年龄要怎么做呢?
首先,我们看看,第二个数字,前面有一个逗号,后面有一个 岁 字,因此正则表达式为
/,[[:digit]]岁/
如果我们想在数字前添加 年龄 两个字,那么替换正则表达式应该是
s/[[:digit]]岁/年龄 &/
完整命令如下
[www.ddkk.com]$ sed 's/[[:digit:]]*岁/年龄 &/' data.txt
运行结果如下
1) 小明,年龄 23岁,北京大学
2) 小红,年龄 22岁,清华大学
3) 小李,年龄 25岁,斯坦福大学
4) 小王,年龄 22岁,清华大学