目录
流编辑器, 自然要涉及文件,实际上,sed 的工作就是把文件或字符串里面的文字经过一系列编辑命令 转换为另一种格式输出,文档就像河流的源头,sed 就像卡在河流中间的过滤器,所有的文 本经过 sed 过滤之后形成另一个样子。sed 就是这样的一种东西
.例子
下面是文件内容
例子1 替换
sed "s/-year/years/" people.txt
将"-year"改成" years"
从 people.txt 中读取一行,然后使用正则表达式-year 来试图匹配某 单词,如果匹配成功,则将之替换成 years。
例子2 指定某些行替换
sed "2s/-year/years/" people.txt
将第 2 行的"-year"改成" years"。
sed "2,5s/-year/years/" people.txt
sed "2,5s/-year/years/" people.txt
例子3 直接通过 sed 修改原文,加选项 -i:
sed -i "2s/-year/years/" people.txt
sed 缺省状态下不会修改原文,默认状态下他只是对原文的复制品进行了加工
例子4 替换每一行中的所有的小写 s 成大写 S:
sed "s/s/S/g" people.txt
g 的意思是一行中所有的匹配项,否则缺省只会匹配第一个 s。
sed "s/s/S/2g" people.txt
替换每一行中的第 2 个以后的小写 s 成大写 S:
例子5 多个匹配
将"-year"改成" years",并且将第 3 行以后的最后一个任意字符去掉:
sed 's/-year/ years/; 3,$s/.$//' people.txt
等价于
sed -e 's/-year/ years/' -e '3,$s/.$//' people.txt
第二个动作中 3,$指的是从第 3 行到最后一行,紧跟着的 s 代表替换,然后/.$//表 示将行尾的一个任意字符,替换为空(即删除),因为最后两个正斜杠紧挨在一起,里面没 有任何字符,代表空。
例子6 将&代替被匹配的变量:
sed "s/is/[&]/" people.txt
将文本中每一行出现的第一个 is 的左右两边加上[ ]
例子7 提前预读多一行缓冲来进行匹配
sed 'N;s/is/IS/' people.txt
由于替换只会针对第一个出现的单词 is,而通过 N 又多读了一行,因此这个命令的 结果是只会替换奇数行
例子8 在指定行的前面插入(i)或者后面插入(a)一些信息
sed '3i x' people.txt 意思是:在第 3 行的前面插入
sed '2a x people.txt 意思是:在第 2 行的后面插入
sed '1,4a x people.txt 意思是:分别在第 1 至 4 行后插入 x
sed '/US/a x people.txt 意思是:在匹配 US 的行后插入 x
例子9 将指定的行替换成其他信息
sed “2c ok” people.txt 意思是:将第 2 行替换成 ok
例子10 将指定的行删除掉
sed ‘2d’ people.txt 意思是:将第 2 行给删掉
sed ‘/US/d’ people.txt 意思是:将匹配/US/的所有行删掉
sed ‘/\<he\>/d’ people.txt 意思是:将匹配 he 的所有行给删掉,
注意:之所以要用< >将 he 给括起来,是因为不想匹配 she,当然,< >需要转义,写成\<\>
例子11 打印指定匹配的行
sed '/Chen/p' people.txt -n 意思是:打印匹配 Chen 的行
sed '/Chen/, /Lau/p' people.txt -n 意思是:打印匹配Chen 或者 Lau 的行
sed '3,/UK/p' people.txt -n 意思是:从第 3 行开始打印直到匹配 UK 为止
sed '/UK/,6p' people.txt -n 意思是:从匹配 UK 的行开始打印,直到第 6 行为
例子12 使用相对位置
sed '/US/, +2p' people.txt -n 意思是:打印匹配 US 的行,并打印其后的 2 行
例子13 执行多个命令
sed '{/he/{/18/p}}' people.txt -n 意思是:匹配所有/he/的行之后,再匹配/18/的行,然后打印出来