sed是一种非交互式的文本编辑器。它能执行编辑任务,并且是非交互,非常适合用于脚本中。
sed可以对文件中的内容进行编辑,但是它不改变原文件的内容,而是以行为单位,把正在编辑的行加载到内存的临时缓冲区中,处理之后发送到屏幕,然后删除缓存区中的内容,再加载下一行要处理的内容,直到处理完输入文件的最后一行才结束运行。而sed命令通过-i选项也可以直接更改原文件的内容,非常有用。
与grep一样,sed在文件中查找模式的时候也要使用正则表达式和元字符(参见我的博客:grep命令详解)。正则表达式是括在斜杠间的模式,用于查找和替换等。
sed命令的使用格式为:sed [options] "ADDRESScommand" filename...
ADDRESS指sed的定址,用于决定对那些行进行编辑。地址的形式可以是数字,正则表达式或二者的结合。如果没有定址,默认sed将处理整个文件中的所有行。如果地址是一个数字,则代表行号。$用来指待输入文件的最后一行。如果给出的是逗号分隔的两个行号,那么处理的地址就是这两行之间的氛围(包括这两行),后面加命令的话用“\”。如果是正则表达式的话,就是处理与模式匹配的字符行,后面加命令的话用"/"。
例:sed -n '1,2p' filename 显示文件的前两行
sed -n '/ro.*/p' filename 显示文件由ro,后接任意字符的行
sed -n '/ro.*/=' filename 获取匹配行的行号
sed -n '/anaconda/,/NOTICE/p' filename 打印匹配行之间的内容
sed -n '/anaconda/,10p' filename 打印匹配行到第10行的内容
sed '/name/a\leeshengjia' filename 查找到文件的name字符串,然后再此行下面添加“leeshengjia”这个字符串
下面我们来说说sed的常用命令:
d 删除行
例:sed '1d' filename 删除第一行的内容
sed '/root/d' filename 删除有root的行
p 显示(匹配的行再显示一遍)
例:sed '1,2p' filename 第一行和第二行会显示两遍
a\ 在匹配行或者指定行后面新增加一行内容
例:
sed '/who is lee/a\lee jia' filename 如果正则匹配到了who is lee这一行,就在这行后面添加一行
sed -i '1a/lee jia' filename 在文件第一行后面添加一行
i\ 在匹配行的上一行新增加一行内容
s s表示用一个字符串替换另一个
用法为:s@@@flag
@只是一个字符,可以随意指定,但是必须是被替换和替换字符串中没有的。
flag有两种:
g:全局替换,即一行中只要匹配的全替换
i:忽略大小写,只匹配一行中的第一个,剩下的不替换
例:sed 's@root@jia@g' filename 把文件中所有行中的root替换成jia
sed 's@^root\(.*\)@jia\1@g' filename 把文件中所有以root为行首的行中,把root替换成jia,其余的不变
sed 's@ROOT@jia@i' filename 把root或是ROOT替换成jia
c\ 替换,后面加字符串,替换m,n行之间的内容
例:sed '/root/c\jia' filename 替换有root的行为jia
sed常用的选项有:
-n 只有经过sed处理的行才会被显示处理(默认输入文件中的内容都显示,处理的行会显示两遍)
例:sed -n '1,2p' filename 只显示1,2行
sed -n 's/lee/LEE/p' test 只会显示被匹配的行
-e 一个sed命令可以跟多个出来条件
例:sed -e '1d' -e '2d' filename
-i 直接修改原文件
例:sed -i '1i\########' filename 在filename文件的第一行插入#
sed '1 s/11/aa/g' filename 把filename文件第一行的11全部替换成aa
-f 读取sed脚本,可以把处理条件写入一个文件,然后用-f选项指定文件读取脚本
例:脚本文件change中的内容为:s/lee/LEE/
执行命令:
echo leeshengjia |sed -f change 显示的是LEEshengjia
-r 支持扩展型的正则表达式