Linux学习笔记10-sed

##Linux学习笔记10-sed
sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。sed可以做些什么呢,与同是编辑器的vi有何不同?

可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用sed,这与awk基本相同。使用sed需要记住的一个重要事实是,无论命令是什么, sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。
和grep与awk一样,sed是一种重要的文本过滤工具,或者使用一行命令或者使用管道与grep与awk相结合

读取数据
sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。

调用sed
调用sed有三种方式:
1.在命令行键入命令;
sed [选项] sed命令输入文件。
在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。
2.将sed命令插入脚本文件,然后调用sed;
sed [选项] -f sed脚本文件输入文件
3.将sed命令插入脚本文件,并使sed脚本可执行。
sed脚本文件[选项] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中接受输入,一般是键盘或重定向结果。
sed选项如下:
n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。
f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed
命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。

保存sed输出
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可。下面的例子重定向sed命令的所有输出至文件‘myoutfile’,当对结果很满意时使用这种方法。
sed ‘some-sed-commands’ input-file > myoutfile

使用sed在文件中查询文本
sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2) 使用正则表达式。
如:
x x为一行号,如1
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行。例如/disk/ disks/
/pattern/, x 在给定行号上查询包含模式的行。如/ribbon/,3
x,/pattern/ 通过行号和模式查询匹配行。3./vdu/
x,y! 查询不包含指定行号x和y的行。1 , 2 !

基本sed编辑命令 p 打印匹配行 = 显示文件行号 a\ 在定位行号后附加新文本信息 i\ 在定位行号后插入新文本信息 d 删除定位行 c\ 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 l 显示与八进制A S C I I代码等价的控制字符 {} 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 n 延续到下一输入行;允许跨行的模式匹配语句