一、简介
sed是一种流编辑器,能够完美的配合正则表达式使用。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作。
1.1 sed的命令使用
sed的使用方式有两种:
#sed的命令格式
sed [options] 'command' file(s);
#sed的脚本格式,即将command写入scriptfile中
sed [options] -f scriptfile file(s);
常用的options
- -r: 支持扩展正则表达式;
- -n: 静默模式;在“模式空间”中没能被处理的就不再输出至标准输出设备
- -e command1 -e command2:指定多命令编辑运行;
- -f /path/to/script_file:从指定的文件中读取脚本并运行;
- -i: 直接修改源文件(即处理结果输出给源文件);
command之定位范围
Sed在没有给定的范围时,默认会处理所有行,一旦给点范围则只会将范围内的行放入模块空间中,等待处理。
sed支持以下几种范围定位
- #: 指定行,其中$特指最后一行;
- /regexp/:任何能够被regexp所匹配到的行;
- %regexp%:同上,只不过换作%为regexp边界符;
- |%regexp%|:匹配时忽略字符大小写;
- startline,endline:行范围指定
num1,num2:从num1行到num2行
#,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;
/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行; - #,+n:从#行开始,一直到向下的n行;
- first~step:指定起始行,以及步长; 1~2表示 1,3,5,7,9……行
conmmand之处理操作
- a\text 在当前行下面插入文本text;
- i\text 在当前行上面插入文本text;
- c\text 把选定的行改为新的文本text;
- d 删除,删除选择的行;
- s 替换指定字符。格式:s/regexp/replacement/;把regexp所匹配到的内容替换为replacement,也可以使用@替代/;有两个修饰符:
g: 全局替换,即整行匹配的都完成替换;i: 不区分大小写
- n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
sed -n 'p;n' test.txt #奇数行
- p 打印缓存模式中的行。
- r file 从file中读行;
- w file 写并追加缓存模式中的行到file末尾;
- W file 写并追加缓存模式中的第一行到file末尾;
- ! 表示后面的命令对所有没有被选定的行发生作用;
- = 打印当前行号;
1.2 sed命令用例
#替换文本中的字符串:
sed 's/book/books/' file
#-n选项和p命令一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
#直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books
sed -i 's/book/books/g' file
#删除空白行:
sed '/^$/d' file
#删除文件的第2行:
sed '2d' file
#删除文件的第2行到末尾所有行:
sed '2,$d' file
#删除文件最后一行:
sed '$d' file
#删除文件中所有开头是test的行:
sed '/^test/'d file
#已匹配字符串标记&
echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]
#匹配字符串分组
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa
#在example中所有包含test的行都被写入file里:
sed -n '/test/w file' example
#将 this is a test line 追加到 以test 开头的行后面:
sed '/^test/a\this is a test line' file
#i\命令 将 this is a test line 追加到以test开头的行前面:
sed '/^test/i\this is a test line' file