sed是一种非交互式的流编辑器,通过多种转换修改流经它的文本,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed可做的编辑工作包括删除、查找替换、添加、插入、从其他文件中读入数据等。
注:要想保存修改后的文件,必须使用重定向生成新的文件。如果想直接修改源文件本身则需要使用“-i
”参数。
sed命令使用的场景包括以下一些:
- 常规编辑器编辑困难的文本
- 太过于庞大的文本,使用常规编辑器难以胜任
- 有规律的文本修改,加快文本处理速度(比如全文替换)
使用sed修改文件流的方式如下:
sed [options] 'command' file
options是sed可以接受的参数
command是sed的命令集(一共有25个)
使用-e参数和分号连接多编辑命令
-e参数本身只是sed的一个简单参数,表示将下一个字符串解析成sed编辑命令,一般情况下可以忽略,但是当sed需要传递多个编辑命令时该参数就不能少了。
注:sed默认不修改原文件,如果希望保存修改后的文件则需要">"重定向
如果想直接修改原文件,使用"-i"参数
sed常用命令:
sed常用参数
sed常用正则表达式匹配
例:
准备一个sed.txt文件来做试验:
将this改为That,line改为LINE,多个编辑命令可以使用-e
参数连接
也可以使用分号连接两个编辑命令
删除:
用户d
命令可删除指定的行
将文件的第一行删除后输出到屏幕sed '1d' sed.txt
删除指定范围的行(第1行到第3行)sed '1,3d' sed.txt
删除第3行到最后一行sed '3,$d' sed.txt
删除最后一行sed '$d' sed.txt
删除所有包含“second”的行sed '/second/d' sed.txt
删除空行sed '/^$/d' sed.txt
查找替换
使用s
命令可将查找到的匹配文本内容替换为新的文本,默认情况只替换第一次匹配到的内容sed 's/line/LINE/' sed.txt
如果想只替换第二个line为LINEsed 's/line/LINE/2' sed.txt
使用g
选项,可以完成所有匹配值的替换sed 's/line/LINE/g' sed.txt
将以this开头的this替换为thatsed 's/^this/that/' sed.txt
过滤出ens32网卡的IP地址和掩码信息
字符转换
使用y
命令可以进行字符转换,其作用为将一系列字符逐个地变换为另外一系列字符。
基本用法如下:
以下命令会将file中的O转换为N、L转换为E、D转换为W
注意转换字符和被转换字符的长度要相等,否则sed无法执行
sed 'y/OLD/NEW' file
如:sed 'y/1245/ABCD/' sed.txt
插入文本
使用i
或a
命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入
在第二行前插入文本sed '2 i test' sed.txt
在第二行后插入文本sed '2 a test' sed.txt
如果要同时新增很多行,则每行之间用\n
来进行新行的添加sed '2 a\test\ntest2\ntest3' sed.txt
取代行
c
命令,c
的后面可以接字符串,这些字符串可以取代n1,n2
之间的行sed '2,4c this is 2-4 line' sed.txt
读入文本
使用r
命令可从其他文件中读取文本,并插入匹配行之后。
如:将/etc/passwd中的内容读出放到Sed.txt空行之后sed '/^$/r /etc/passwd' sed.txt
打印
使用p
命令可进行打印,这里使用sed
命令时一般都加-n
参数,表示不打印没关系的行。不加-n
参数,会输出所有行,找到的行会重复显示sed '/is/p' sed.txt
加-n
参数,只显示找到的行sed -n '/is/p' sed.txt
sed脚本
使用sed脚本可以加快工作效率,调用sed命令并使用-f参数指定文件
写如下脚本,作用是将全文的this改成THAT,并删除所有空行
执行sed脚本sed -f sed1.rules sed.txt
也可以这样写脚本(第一行是sed命令解释行)