Stream EDitor, 行文本编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间” (pattern space),接着用sed命令处理缓冲区中的内容,如果读入的行不符合需求,则不处理直接把内容送往屏幕, 符合需求的内容处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,
直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。没有使用w选项的话,所有的改变只保留在默认输出 上(屏幕),原文件内并不做任何改动.
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]... 'script' inputfile...
sed+选项+地址命令+输入文件(可以为多个),其中地址命令可以省略,直接sed+输入文件效果类似于cat。
常用选项: -n:不输出模式空间内容到屏幕,即不自动打印,但是后面可以跟#p来指定打印第几行
sed -n '3p' 123.txt
打印123.txt的第三行。
p: 打印 ,直接sed + 'p' + 文件的话,会把指定文件打印两次.因为sed默认就是输出,p又指定打印一次. 而sed + #p + 文件的话,则会将指定行打印2次,其余行打印一次.
-e: 多点编辑,即可以指定多个规则.
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑,只有加了i,所有的设置才会在原文件中生效.加上-i.bak后,会自动创建出 以原名件名.bak的备份文件,原文件内容被替换,但备份文件内容与被修改前一样.(.bak可以改成任意字符串)
script:'地址命令’
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
sed 123.txt |sed 1p
打印第一行,不能用正则的^来代替第一行. 因为事先不知道一共有多少行,所以$p还能表达最后一行的意思.
/pattern/:被此处模式所能够匹配到的每一行.
cat 123.txt |sed -n /abc/p
打印123.txt当中,包括abc字符的行. 不能使用sed打开文件后,再传递给sed.
(3) 地址范围: #,#
cat 123 |sed -n 3,5p
打印出123文件中,第三行到第五行的内容.
#,+#
cat 123 |sed -n 3,+1p 只支持加+.不支持减-.
打印出123文件中,第三行及随后的一行.
/pat1/,/pat2/
cat 123 |sed -n /who/,/which/p
打印出123文件中,从who开始,which]结尾中间的所有行数.
#,/pat1/
cat 123 |sed -n 1,/which/p
打印出123文件中,第一行到which结尾中间的所有行数.
(4) ~:步进 1~2 奇数行
seq 1 10 |sed -n 1~2p
1
3
5
7
9
2~2 偶数行
seq 1 10 |sed -n 2~2p
2
4
6
8
10
编辑命令:
p:打印当前模式空间内容,追加到默认输出之后,使用p的时候要把-n加上,否则会输出两遍。
d: 删除模式空间匹配的行,并立即启用下一轮循环
seq 1 3|sed 2d
1 3 删除指定的行数。
a []text:在指定行后面追加文本,支持使用\n实现多行追加
cat 123 | sed 2a7254891 在第二行的尾部,追加新的一行,内容为7254891.
cat 123 | sed 2a7254891\n123456
在第二行的尾部,追加新的一行,内容为7254891n123456
cat 123 | sed "2a7254891\n123456"
在第二行的尾部,追加新的二行,内容分别为7254891和123456(另起一行).
cat 123 | sed "2,3a77777"
将123文件中,第二行和第三行后面分别加上77777.
i []text:在行前面插入文本,和a相反.
c []text:替换行为单行或多行文本
cat 123 | sed "2c77777\n123"
从第二行开始,将77777替换为原来第二行的内容,并在下方追加一行123,原来的第三行变为第四行.
cat 123 | sed "2,3c77777
将123文件中的第二,第三行内容,替换为一行,内容为77777.
w /path/somefile: 保存模式匹配的行至指定文件
cat 123 |sed w/app/321
将123文件在模式空间的内容,另存为321,保存至/app目录下.
r /path/somefile:读取指定文件的文本至模式空间中
cat 123 |sed w321
将321的内容,逐行追加到123的行尾,如果有指定匹配项,则在匹配项后追加.
注意:不指定位置的话,追加方式为逐行追加(即在123的每一行下方,都追加一次全部的321内容.包括空行).
cat 123 |sed 2w321
将321文件的内容,追加到123文件的第二行尾部.
匹配到的行后 =: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
sed工具 s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换 s/替换内容/g,如果想忽略大小写,可以在g后面加上i,变为s/替换内容/gi即可. 替换一行中的某一部分. 格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
cat 123 |sed 's/who/i/g' 将123文本中的who,替换为i.
cat 123 |sed '1,3s/who/i/g' ,将123文本中的第一行和第三行的who替换为i.
替换匹配行中的某个字符串
格式sed -i '/匹配字符串/s/匹配字符串/替换目标字符串/g' filename
cat 123 | sed -i '/aaa/s/aaa/apple/g'
将123文件中的aaa,替换为apple
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
例子:
sed ‘2p’ /etc/passwd
第二行打印2次,其余行打印一次.
sed –n ‘2p’ /etc/passwd
只打印第二行.
sed –n ‘1,4p’ /etc/passwd
只打印1--4行.
sed –n ‘/root/p’ /etc/passwd
只打印包含root的行.
sed –n ‘2,/root/p’ /etc/passwd
从2行开始,只打印包含root的行.
sed-n ‘/^$/=’ file
显示空行行号
sed–n–e ‘/^$/p’–e ‘/^$/=’ file
先打印所有空行,并把空行打上行号.
sed ‘/root/a\superman’ /etc/passwd行后
将/etc/passwd文件中,所有root的行后,追加一行内容为superman的行.
sed ‘/root/i\superman’ /etc/passwd 行前
将/etc/passwd文件中,所有root的行前,追加一行内容为superman的行.
sed ‘/root/c\superman’ /etc/passwd 代替行
将/etc/passwd文件中,所有root的行,替换内容为superman的行.
sed ‘/^$/d’ file
删除所有空行.
sed ‘1,10d’ file
删除第一行到第十行.
nl /etc/passwd | sed ‘2,5d’ nl会将打开的文本,自动加上行号.
删除第二到第五行
nl /etc/passwd | sed ‘2a tea’
在第二行后追加一行,内容为 tea(没有空格)
sed 's/test/mytest/g' example
将example文件当中,所有的test替换为mytest。
sed –n ‘s/root/&superman/p’ /etc/passwd 这里的&符号相当于互相引用,&引用前方的词.
将passwd文件中,root单词后方加上superman。,变为rootsuperman.
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
将passwd文件中,root单词前方加上superman。,变为supermanroot.
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
将pets中的dog换成cat,再将hi换成lo.
sed –i.bak ‘s/dog/cat/g’ pets
sed高级编辑.sed有模式空间(临时缓存区)及保持空间(相当于仓库). Pattern Space相当于车间,sed把流内容在这里进行处理,Hold Space相当于仓库,加工的半成品在这里进行临时 存储基于用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保存以便下一次处理都有可能使得 sed在处理文件的时候不按照正常的流程来进行,这个时候,sed设置了一些高级命令来满足用户的要求。
P:打印模式空间开端至\n内容,并追加到默认输出之前.
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行至模式空间,用下一个命令处理新的行而不是用第一个命令
N:读取匹配到的行的下一行追加至模式空间,并在两者之间嵌入一个新行,改变当前行号.
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输 入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样 启动正常的新循环
sed-n 'n;p' FILE 先读入文件的第一行至模式空间,执行n命令(读取下一行并覆盖模式空间),再执行命名p(打印至屏幕) 所以最终结果是只打印了偶数行。和 sed -n 2~2p 一样了。
sed '1!G;h;$!d' FILE !为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行d命令, 删除模式空间的内容,$!d的意思是,最后一行不执行删除.所以这时保持空间当中只有第一行内容。 接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间 的内容覆盖至保持空间.再开始执性d命令删除模式空间内容,这时保持空间内容为第二行及第一行. 依次类推,直到执行完后,保持空间的内容相对于原文件而言,已经是倒序了.也就是 sed '1!G;h;$!d'=tac(倒序)
sed 'N;D‘ FILE N一次读入两行至模式空间(a行和b行),并删除上一行内容(a行),D如果当前模式空间内有换行符,则删除上一行内容, 然后使用删除后的模式空间内容(b行),接着再次读入一行(c行).再开始删除上一行(b行),再使用删除后的模式空间(c行) 读取下一行...直至读完整个文本,输出模式空间内容至屏幕上.这时只会打印最后一行.也就是sed 'N;D‘ =tail -1.
sed '$!N;$!D' FILE $!N不是最后一行就读取两行.$!D不是最后一行就删除模式空间的上一行.直到最后一行时不再删除模式空间的上一行 并将模式空间内容打印至屏幕上,相当于只打印后两行内容.也即是sed '$!N;$!D'=tail -2
sed '$!d' FILE 不是最后一行就删除,相当于只要最后一行.也就是 sed '$!d' = sed 'N;D‘ = tail -1.
sed ‘G’ FILE 从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了一个空白行.
sed ‘g’ FILE 从保持空间取出数据覆盖至模式空间,而最开始保持空间内容为0.相当于原文件全被变成空白行了.(但总行数不变)
sed ‘/^$/d;G’ FILE 删除空白行,再从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了 一个空白行.但和直接的G不同,这个命令会将所有的空白行全部删除,只在非空白行下面追加一个空白行.
sed 'n;d' FILE 读取下一行内容至模式空间,然后执行d命令删除,相当于隔行保留.也就是 sed 'n;d' = sed -n 1~2p
sed -n '1!G;h;$p' FILE !为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行p命令, $p的意思是,最后一行打印.这时候不打印. 接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间 的内容覆盖至保持空间.再开始执行$p命令,依然不打印.这时保持空间内容是第二行,第一行。依次类推,直到执行至 最后一行全部打印.相当于倒序.也就是:sed '1!G;h;$!d'=tac(倒序) = sed -n '1!G;h;$p'