sed是stream editor的缩写,一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
sed命令格式
sed命令和选项:
sed [nefri] 'command' file(s)
常用选项:
-n 使用安静(silent)模式。在一般sed的用法中,所有来自stdin的资料一般都会被列出到屏幕,但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者command)才会被列出来。
-e 允许多点编辑。
-f 直接将sed的动作写在一个档案内,-f filename 则可以执行filename内的sed动作。
-r sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i 直接修改读取的档案内容,而不是由屏幕输出。
常用command:
a\ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c\ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d 删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i\ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
高级command:
命令 功能描述
h 拷贝pattern space的内容到holding buffer(特殊缓冲区)。
H 追加pattern space的内容到holding buffer。
g 获得holding buffer中的内容,并替代当前pattern space中的文本。
G 获得holding buffer中的内容,并追加到当前pattern space的后面。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
P 打印pattern space中的第一行。 //大写
q 退出sed。
w file 写并追加pattern space到file的末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
s/re/string 用string替换正则表达式re。
= 打印当前行号码。
替换标记
g 行内全面替换,如果没有g,只替换第一个匹配。
x 互换pattern space和holding buffer中的文本。
y 把一个字符翻译为另一个字符(但是不能用于正则表达式)。
需要说明的是,sed中的正则和grep的基本相同,完全可以参照本系列的第一篇中的详细说明。
打印整个文件,匹配行打印两次
sed '/1/p' sed1.txt
只打印匹配行
sed -n '/1/p' sed1.txt
多个条件匹配或(OR)
匹配 ERR 或者 NOTIC
sed -n '/ERR\|NOTIC/p' 16_11_23.log
多个条件匹配与 (AND)
匹配 NOTIC 和 [2]
sed -n '/NOTIC/{/\[2\]/p}' 16_11_23.log
打印5-7行
sed -n '5,7p' sed1.txt
删除第三行,其他行默认打印到屏幕
sed '3d' sed1.txt
替换字符串
sed 's/《/[[/g' sed1.txt
将所有匹配写入新文件中。
sed -n '/1/w sed2.txt' sed1.txt
i是插入命令,在匹配模式行前插入文本。
sed -n '/1/i\这些是插入的文字' sed1.txt