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