sed(stream editor)是一种非交互的流编辑器,通过多种转换修改流经它的文本。但是,默认情况下,sed并不会改变原文件本身,而只是通过sed命令的文本进行修改,并将修改后的结果打印到标准输出中(也就是屏幕)。sed处理文本时是以行为单位的,每处理完一行就立即打印出来,然后再处理下一行,直至全文处理结束。
准备如下文件Sed.txt
this is line 1,this is First line this is line 2,the Second line,Empty line followed this is line 4,this is Third line this is line 5,this is Fifth line
使用sed修改文件流的方式如下:
sed [options] 'command' file #options是sed可以接受的参数 #command是sed的命令集(一共25个) #使用-e参数和分号链接多编辑命令 #该参数本身只是sed的一个简单参数,表示将下一个字符串解析为sed编辑命令 #一般情况下可以忽略,但是当sed需要传递多个编辑命令时该参数就不能少 #下面的例子就是演示了在将this改为That的同时,还要将line改为LINE #两个编辑命令前都要使用-e参数,如果有更多的编辑需求,以此类推 sed -e 's/this/That/g' -e 's/line/LINE/g' Sed.txt
#使用分号连接两个都编辑命令 #上面的命令可以用分号改写为: sed -e 's/this/That/g;s/line/LINE/g' Sed.txt
删除
使用d命令可以删除指定行
#将file的第一行删除输出到屏幕 #删除第二行类似 sed '1d' Sed.txt
#由于sed默认不修改原文件,如果希望保存修改后的文件则需要用重定向 sed '1d' Sed.txt > saved_Sed.txt #如果想直接修改文件,使用-i参数 #这里不会有任何输出,而是直接修改了源文件,删除了第一行 #sed -i '1d' file #删除指定范围的行(第1行到第3行) #sed '1,3d' Sed.txt
#删除指定范围的行(第一行到最后行) #sed '1,$d' Sed.txt #清空了文件
#删除最后一行 #sed '$d' Sed.txt
#删除除指定范围以外的行(只保留第4行) #sed '4!d' Sed.txt
#删除所有包含Empty的行 sed '/Empty/'d Sed.txt
#删除空行 #sed '/^$/d' Sed.txt
查找和替换
使用s命令可将查找的匹配文本内容替换为新的文本
#s命令用于替换文本,本例中使用LINE替换line #请注意每一行只有第一行line被替换了,默认情况下只替换地刺匹配到的内容 #sed 's/line/LINE/' Sed.txt
#要想每行最多匹配2个line,并改为LINE,可用如下方式 #注意第2行中有3个line,前两个被替换了,第三个没有变化 sed 's/line/LINE/2' Sed.txt
#s命令利用g选项,可以完成所有匹配值的替换 #sed 's/line/LINE/g' Sed.txt
#只替换开头的this为that #sed 's/^this/that/' Sed.txt
字符替换
使用y命令可进行字符转换,其作用是将一系列字符逐个地址转换为另外一系列字符,基本用法如下:
#该命令会将file中的O转换为N,L转换为E,D转换为W #注意转换字符和被转换字符的长度要相等,否则sed无法执行 sed 'y/OLD/NEW/' file #下面的命令演示了将数字1转换为A,2转换为B,4转换为C,5转换为D的用法 sed 'y/1234/ABCD/' Sed.txt
插入文本
使用i或a命令插入文本,其中i代表在匹配行之前插入,而a代表匹配之后插入
#使用i在第二行插入文本 sed '2 i Insert' Sed.txt
#使用a在第二行后插入文本 sed '2 a Insert' Sed.txt
读入文本
使用r命令可从其他的文件中读取文本,并插入匹配行之后
#将/etc/passwd中的内容读取放到Sed.txt空行之后(必须得有空行,不然不生效) sed '/^$/r /etc/passwd' Sed.txt
打印
使用p命令可进行打印,这里使用sed命令时一定要加-n参数,表示不打印没关系的行。由于sed的工作原因是基于行的,因此每次都有大量的输出。
可是这些输出中有一些是我们并不需要看到的,而只是需要输出匹配的行或者处理过的行就好了。
#打印出文件中指定行 sed -n '1p' Sed.txt
#将the替换成THE #sed实际处理了第二行,其他几行由于没有匹配所以并未处理 #但是sed的工作原理是基于流的,所以所有流过的行都打印出来了 sed 's/the/THE/' Sed.txt
#使用p命令,则只打印实际处理过的行,简化了输出(使用-n参数) sed -n 's/the/THE/p' Sed.txt
写文件
sed本身默认并不改写原文件,而只是对缓冲区的文本做了修改并输出到屏幕,所以想保存文件,除了使用重定向或者使用-i参数这两种方式之外,还可以使用w命令将结果保存到外部
指定文件
sed -n '1,2 w output' Sed.txt #这里没有任何输出,因为输出被重定向到了文件
#文件output中的内容正是Sed.txt文件中前两行的内容 cat output
sed脚本
在平常的工作中,可能需要定期对一些文件做分析操作,这种例行的工作往往有一些“标准化”的操作,比如说先去除文件中所有的空行,然后在替换某些字符等。这些种过程类似于生产线的流水操作。事实上,可以把这些动作静态化地写到某个文件中,然后调用sed命令并使用-f参数指定该文件,这样就可以将这一系列动作‘装载’并应用于指定文件之中,这无疑加快了工作效率,这种文件就是sed脚本。
#该sed脚本的作用就是将全文的this改为THAT,并删除所有空行 cat Sed.rules s/this/THAT/g /^$/d #使用-f参数指定该脚本并应用于Sed.txt #从输出内容可以看出执行效果 sed -f Sed.rules Sed.txt
sed常用命令总结
sed常用命令
sed命令 | 作用 |
a | 在匹配行后加入文本 |
c | 字符转换 |
d | 删除行 |
D | 删除第一行 |
i | 在匹配的行掐面加入文本 |
h | 复制模块的内容到存储空间 |
H· | 追加模块的内容复制到模式空间 |
g | 将存储空间内容复制到到模式空间 |
G | 将存储空间的内容追加到模式空间 |
n |
读取下一个输入行,用下一个命令处理新的行 |
N | 追加下一个输入行到莫板块后并在二者间插入新行 |
p | 打印匹配的行 |
P | 打印匹配的第一行 |
q | 退出sed |
r | 从外部文件中读取文本 |
w | 追加写文件 |
! |
匹配的逆 |
s/old/new | 用new替换正则表达式old |
= | 打印当前的行号 |
sed的常用参数
sed参数 | 作用 |
-e | 多条件编辑 |
-h | 帮助信息 |
-n | 不输出不匹配的行 |
-f | 指定sed脚本 |
-V | 版本信息 |
-i | 直接修改原文件 |
sed常用的正则表达式匹配
元字符 |
作用 |
^ | 匹配行的开始。如:/^cat/匹配所有以cat开头的行 |
$ | 匹配行的结束。如:/cat$/匹配所有以cat结尾的行 |
. | 匹配任意一行非换行字符。如:/c.t/匹配c后接入任意字符,然后是t |
* | 匹配零个或任意多个字符。如/*cat/匹配一串字符后紧跟cat的所有行 |
[] | 匹配指定范围内的字符。如:/[Cc]at/匹配cat和CAT |
[^] | 匹配不在指定范围内字符。如:/[^A-Z]/匹配不是以大小写字母开头的行 |
\(..)\ | 保存匹配的字符。如s/\(love)able/\lrs/ loveable被替换为lovers |
& | 保存搜索字符用来替换其他字符。如s/love/**&**/,love变成**love |
\< | 锚定单词的开始。如/\ |
/> | 锚定单词的结束。如/cat/>\匹配包含以cat结尾的单词的行 |
x\{n\} | 重复字符x,m次。如:/o\{5\}/匹配包含5个o的行 |
x\{m,,\} | 重复字符x,至少m次,如:/o\[5,\}/匹配至少有5个o的行 |
x\{n,m\} | 重复字符x,至少m次,不多于n次。如/o\{5,10\}/匹配5到10个o的行 |