简介
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。它能执行与编辑器 vi 相同的编辑任务,但是sed不提供交互式使用方法,除非重定向到文件,否则,sed默认输出到标准输出。
原理
sed 逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
正则表达式
[]:无论中括号内几个字符,都只代表一个
[n1-n2]:列出想要取得字符范围
[^]:反向选择中括号的字符
^word:以word为首的行
word$:以word结尾的行
^$:空白行
.(点):代表一定有一个任意字符
*:代表重复前一个字符0到无穷次
.*:代表任意字符
\(..\) #标记匹配字符,如'\(good\)',good被标记为1。
\:转义特殊字符,使之成为原本的意思
\< '\<grep'匹配包含以grep开头的单词的行。
\> 'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} 重复字符x,m次。
x\{m,\} 重复字符x,至少m次
x\{m,n\} 重复字符x,至少m次,不多于n次
常用操作指令
d删除命令
$:代表最后一行
a:后面追加
i:前面追加
c:替代
p:列举某几行(-n必须要有,如果没有会重复输出所选取的行)
s:搜寻并取代 sed ‘s/要被取代的字符串/新的字符串/g’
-i:直接修改文件
e 多重编译
q 命令表示退出命令
(新增多行的话要加上\)
使用举例
创建名为catfile的文件,内容如下,以该文件作为测试内容
d删除命令
sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示
[fangfang@VM_0_9_centos ~]$ sed '3d'(删除第三行)
name uid chinese math english
wang 100 70 75 70
sun 102 89 76 88
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ sed '3,$d'(删除第三道最后一行)
name uid chinese math english
wang 100 70 75 70
[fangfang@VM_0_9_centos ~]$ sed '3,4d'(删除第3-4行)
name uid chinese math english
wang 100 70 75 70
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ cat catfile(原始内容)
name uid chinese math english
wang 100 70 75 70
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
p:列举某几行(-n必须要有,如果没有会重复输出所选取的行)
[fangfang@VM_0_9_centos ~]$ sed -n '3,5p'(打印3-5行)
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ head -n 5 catfile| tail -n 3 catfile(打印3-5行)
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
s替换命令 sed ‘s/要被取代的字符串/新的字符串/g’
说明,s表示替换,g表示全局,如果没有g则只替换每行第一个zhao
[fangfang@VM_0_9_centos ~]$ sed 's/zhao/zhou/g' catfile
name uid chinese math english
wang 100 70 75 70
zhou 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
,(逗号)指定行的范围
[fangfang@VM_0_9_centos ~]$ sed -n '3,5p'(3-5行)
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ sed -n '/zhao/,/qian/p' catfile(zhao qian之间的行)
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ sed -n '2,/qian/p' catfile(第2行开始到第一个以qian之间所有的行)
wang 100 70 75 70
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
e 多重编译
说明:sed后面接两个以上的命令时 要加上e,前一次的结果会影响后一次的结果
[fangfang@VM_0_9_centos ~]$ sed -e '2,4d' -e 's/wang/test/g' catfile
name uid chinese math english
qian 103 97 64 87
[fangfang@VM_0_9_centos ~]$ sed -e '2,4d' -e 's/qian/test/g' catfile
name uid chinese math english
test 103 97 64 87
a追加
追加将新文本到文件中当前行(即读入模式的缓存区行)的后面
[fangfang@VM_0_9_centos ~]$ sed '2a apple' catfile
name uid chinese math english
wang 100 70 75 70
apple
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
i增加
追加将新文本到文件当中的当前行的前面
[fangfang@VM_0_9_centos ~]$ sed '2i banana' catfile
name uid chinese math english
banana
wang 100 70 75 70
zhao 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上
[fangfang@VM_0_9_centos ~]$ sed '/zhao/{n;s/sun/liu/;}' catfile
name uid chinese math english
wang 100 70 75 70
zhao 101 80 60 90
liu 102 89 76 88
qian 103 97 64 87
找到zhao的第一行之后的下一行中的sun替换为liu
y表示替换
[fangfang@VM_0_9_centos ~]$ sed '1,3y/abc/ABC/' catfile
nAme uid Chinese mAth english
wAng 100 70 75 70
zhAo 101 80 60 90
sun 102 89 76 88
qian 103 97 64 87
将一到三行中的所有的小写字母abc替换成为大写字母ABC
q 命令表示退出命令
[fangfang@VM_0_9_centos ~]$ sed '4q' catfile(打印第四行后退出)
name uid chinese math english
wang 100 70 75 70
zhao 101 80 60 90
sun 102 89 76 88
[fangfang@VM_0_9_centos ~]$ sed '/zhao/{ s/zhao/ming/;q; }' catfile
name uid chinese math english
wang 100 70 75 70
ming 101 80 60 90