Stream Editor 流编辑器 做行处理的
默认不直接编辑原文件,在内存中进行处理(但是会整篇处理),临时存放的空间叫做pattern space(模式空间)。如果可以被关键字匹配,然后就进行编辑(编辑完成后,可以将新的内容放入hold space,保持空间),如果没有被关键字匹配就默认输出到标准输出。
-n选项不输出模式空间中的内容至屏幕,默认情况下,不论模式空间的内容是否匹配关键字都会输出至屏幕。
-e script 默认只能一次处理一个脚本,-e 之后可以跟多个脚本,一个-e对应一个脚本,实现多点编辑。
-f /path/to/sed_script_file 每行一个编辑命令
-r 支持扩展正则表达式
-i 直接编辑原文件
地址定界
指定编辑范围
空地址表示对全文进行处理
单地址 # 指定行
/pattern/ 被关键字匹配到的每一行
地址范围
#,# 指定行范围
#,+# 指定开始行,并往下#行
#,/pattern/ 指定行开始,到第一次匹配关键的行
/pattern1/,/pattern2/从第一次匹配关键字1开始,到第一次匹配关键字2的行
1~2 ~#表示步进,从第一行开始的奇数行
2~2 从第二行开始的偶数行
编辑命令 都是在操作 模式空间
d 删除指定范围内容
原文件没有改变
删除(不显示)包含UUID字符串的行
注意:这两次d的位置 一次是在''里面,一次是在//外面
可以在外面
现在看看-n的效果
加了-n 什么都看不到了
显示奇数行
删除偶数就是奇数
显示偶数行
删除奇数就是偶数
p:显示模式空间中的内容
为什么1和2出现了两次呢?因为,sed模式会将模式空间中的内容输出来,p的效果是将1和2输出,所以1和2输出了两次,为了不让模式空间的内容输出,只看p的效果,可以加个-n
显示奇数行
显示1到3行
在指定位置增加内容
# \text
在第3行后增加指定内容
添加后的效果,和-n的效果 如果追加的内容里有空格也不用管
在第三行增加多行内容
注意:需要在单引号中写出需要追加的内容
在第三行追加内容,之前的第三行就变成第四行了。
使用指定内容替换指定行
c \text
数字3没了,被This is a test字符串替换了
w将指定范围内的内容另存为其他文档
将非#号开头的行输出来
这里可以看出,sed是支持正则表达式的,这个例子的难点就在于如何标识非#号
r将其他文件的内容追加到指定行
在第四行之后追加内容。
为指定行打印行号
先打印行号,在输出行的内容
! 条件取反
将非#号开头的行输出来
第一个是非#号开头的行,第二个是#号开头的行,第二个命令我用了! 条件取反,而且注意这里的!需要转义,不然就解析为最近一次以p开头的命令并执行
s 查找替换
这个类似于VIM编辑器的查找替换操作,分隔符可以执行指定 @ # 都可以,g表示全局替换(默认选项) w将替换后的内容另存为 ,p显示替换成功的行
删除文件中所有以空白字符开头的行的行首的所有空白符
这个是原文
这个是改过之后的,默认是全局又该
这个就显示被修改过的行
把文件中的1改为a
将指定行的1改为a
sed可以一次执行多次编辑操作
将/etc/fstab中的UUID改为uuid,再将uuid所在的行删除
输入一个绝对路径给sed命令,取出其目录,类似于dirname的命令
发现没有t没有了
我现在加个尾部的定位符
发现i字符没了,所以现在要取出dirname很简单啦
输入一个绝对路径的sed,取出其文件名,类似于basename的命令
这里要取代的是一个范围,需要用\1的方式
高级编辑命令
h 将模式空间中的内容覆盖至保持空间中
H 将模式空间中的内容追加至保持空间中
g 将保持空间中的内容覆盖至模式空间中
G 将保持空间中的内容追加至模式空间中
x 将模式空间中的内容与保持空间中的内容互换
n 读取匹配到的行的下一行至模式空间中。
N 读取匹配到的行的下一行至模式空间中 追加
d 删除模式空间中的行
D 删除多行模式空间中的所有行
p显示模式空间中的内容
案例一 显示偶数行
由于没有指定操作范围,程序首先读入第一行,n的效果是让命令去读取本行的下一行,并将内容读入到模式空间,p的效果是将匹配的模式空间中的内容输出。
案例二 逆序显示文件内容
sed ‘1!G;h;$!d’ file_name
从这个例子中,重新说明了几个问题,第一:sed 从文件中读取的内容首先放入模式空间中,通过匹配之后再放入保持空间中 第二:sed 读取内容是以行为单位的。第三 $符号的意思是读取内容的最后一行。 这个命令的过程类似于汉诺塔的游戏。
案例三 显示最后一行
sed '$!d' filename
案例四 显示最后两行
sed '$!N;$!D' 显示最后两行
当系统读入倒数第二行,由于倒数第二行不是倒数第一行那么就N,读取倒数第一行并追加。现在的模式空间中有2行,程序读取了倒数第一行那就不删除(!D),最后输出到屏幕
案例五
显示奇数行
sed 'n,d' filename
原文地址:http://blog.51cto.com/yueyue207/2090995