sed 全名为 stream editor,流编辑器,是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。
sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。
sed 本身一次处理一行内容。
使用sed 主要就是使用正则模式进行匹配,所以需要了解正则表达式相关内容。
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式 我会单独写一篇内容讲解,此外就不在介绍。
调用sed命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)
sed [options] ‘{command}[flags]’ [filename]
#中括号内容必有 大括号内容可有可无
sed # 执行命令
[options] # 命令选项
{command}[flags] # sed内部选项和参数
[filename] # 文件
命令选项
-e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n 抑制自动输出
-i 编辑文件内容
-i.bak 修改时同时创建.bak备份文件。
-r 使用扩展的正则表达式
! 取反 (跟在模式条件后与shell有所区别)
a : 在匹配行后添加一行或多行内容
c : 用新文件修改(替换)当前行中的文本
d : 删除
g : 全局执行
i : 在匹配的行之前插入文本
p 打印
r : 从以外文件中读相关内容,写到相关行之后
s : 用一个字符替整体替换成另外一个字符(查找替换)
w : 匹配到的行写入一个新的文件之中
y : 将字符转换成一个新的字符
i : 与s指令配合一起使用时,则是忽略大小写的作用flags
数字 表示新文本替换的模式
g: 表示用新文本替换现有文本的全部实例
p: 表示打印原始的内容
w filename: 将替换的结果写入文件
默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-5行,偶数行,或者是包含"word"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。
数字定址其实就是通过数字去指定具体要操作编辑的行,
数字定址有多种方式,每种方式都有不同的应用场景,下边以举例的方式来描述每种数字定址的用法。
固定定位
[root@localhost ~]# sed -n ‘3p’ 1.txt
范围定位
[root@localhost ~]# sed -n ‘1,3p’ 1.txt
sed –n '1s/word/china/' message
命令说明:将第1行中word字符串替换为china,其它行如果有word也不会被替换。
sed –n '3,5s/word/china/' message
命令说明:将第3-5行中word字符串替换为china,其它行如果有word也不会被替换。
sed –n ‘1,+4s/word/china/’ message
命令说明:从第1行开始,再接着往下数4行,也就是1-5行,这些行会把word字符串替换为china。
sed –n '4,~3s/word/china/' message
命令说明:第4行开始,到第6行。解释6的由来,"4,~3"表示从4行开始到下一个3的倍数,这里从4开始算,那就是6了,当然9就不是了,因为是要求3的第一个超过前边数字4的倍数,这种适用场景不会太多。
sed –n '4~3s/word/china/' message
命令说明:从第4行开始,每隔3行就把hello替换为A。比如从4行开始,7行,10行等依次+3行。这个比较常用,比如3替换为2的时候,也就是每隔2行的步调,可以实现奇数和偶数行的操作。
sed –n '$s/word/china/' message
命令说明:符号表示最后一行,和正则中的符号表示最后一行,和正则中的符号表示最后一行,和正则中的符号类似,但是第1行不用^表示,直接1就行了。
sed -n '1!s/word/china/' message
命令说明:!符号表示取反,该命令是将除了第1行,其它行word替换为china,上述定址方式也可以使用!符号。
正则表达式必须放在/ / 之间
数字加数字
数字加正则
正则加数字
正则加正则
\c与c分隔符
\c与c只是一个代表,其中c可以换成任意一个字符
说明:正则匹配是非贪婪性的匹配
正则定址使用目的和数字定址一样,只是它们在使用方式上有所不同,是通过正则表达式的匹配来确定需要处理编辑哪些行,其它行就不需要额外处理。
1、匹配到删除
sed -n '/word/d' message
说明:将匹配到word的行执行删除操作。
例子2:
2、删除空行
sed -n '/^$/d' message
3、匹配区间行进行删除
sed -n '/^THE/,/^COME/d' message
说明:匹配以THE开头的行到COME开头的行之间的行,把匹配到的这些行删除。
4、数字定址和正则定址混用
在实际使用过程中我们经常将数字定址和正则定址可以配合使用,参考下边的例子。
sed -n '1,/^THE/d' message
说明:匹配从第1行到THE开头的行,把匹配的行删除。
sed -n '$=' fyydlz.txt
sed '=' fyydlz.txt
将1-5行迁移到10行后
sed '1,5{H;d};10G' fyydlz.txt
sed '/the/w fyydlz.txt' fyydlz2.txt
本次实操题目内容:
假设文件fyydlz.txt的文本如下(可以利用touch命令和vi命令组合创建):
1. hello fyydlz world
2. wold hello hello
3. nothing is important fyydlz
4. i like movie movie fyydlz
sed 命令可以用来替换文本行、删除文本行,例子如下:
1、查找并替换每行第一个"hello"为"你好":
sed 's/hello/你好/' fyydlz.txt
2、查找替换每行中所有的"hello"为"你好":
sed 's/hello/你好/g' fyydlz.txt
3、删除含有"hello"的行:
sed '/hello/d' fyydlz.txt
4、删除第2行:
sed '2d' fyydlz.txt
5、删除第最后一行:
sed 'd' fyydlz.txt
6、删除第2行到最后一行:
sed '2,d' fyydlz.txt