24、sed 特殊字符命令 &

前面章节,我们已经学习了够多的 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岁,清华大学