## sed高级用法 ##
sed高级用法一般都包含两个空间,一个是模式空间,也就是当前处理输出的缓冲空间,因为sed就是一次处理一行的内容,就会把这一行的内容提取到模式空间,然后用sed命令处理这一行的内容,处理完成后输出到屏幕,接着处理下一行 的内容。而保持空间就是sed的另一个缓冲区,此缓冲区如其名,不会自动清空内容,也不会把缓冲区的内容打印到的标准输出中。所以它需要以下高级命令进行处理:
高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间,打印模式空间的值,并读取下一行。
N:读取匹配到的行的下一行追加至模式空间,它不打印模式空间的值
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模
式空间中的文本, 并不会读取新的输入行,而使用合成的模
式空间重新启动循环。如果模式空间不包含换行符,则会像
发出d命令那样启动正常的新循环。
下图就是对D的很好的解释,显示最后一行
这样是不是很不好理解,那我们来看一下几个例子
1.sed -n ‘n;p’ FILE 显示偶数行
2.sed ‘1!G;h;$p’ FILE 倒序显示
解析:本题有点绕,没有关系,多绕几遍就会懂了。下面是两种情况的截图。
注意:-n就是不输出sed的处理结果,也就是不自动打印模式空间的内容,如果想要输出结果就加上-p。
我们先可以把这题分为两部分,然后进行比较 ,当没有-n时,当读取1的时候,第一行不处理,把第一行内容覆盖至保持空间,当处理完第一行(也就是1),模式空间默认输出的就是1; 然后模式空间提取第二行的内容,此时把保持空间的内容追加到模式空间,这时的模式空间就是2,1,然后把模式空间的内容覆盖到保持空间,此时保持空间的内容就是2,1,处理完毕,模式空间默认输出的就是2,1;模式空间开始提取第三行的内容,此时模式空间就是3,把保持空间的内容追加到模式空间,此时的模式空间内容就是3,2,1,然后把模式空间的内容覆盖至保持空间,保持空间此时就是3,2,1,然后这一动作处理完毕,模式空间内容默认输出3,2,1,本轮就结束,以此类推,一直到所有的行处理完结束,所以这样就会打印每一轮处理的结果。
加上-n就是会把每一轮处理的结果默认不输出,当处理到最后一行的时候,最后一轮的动作处理完毕,打印出来最后一轮的处理结果。
3.sed -n ‘1!G;h;$!d’ 倒序显示
解析:第一行的第一个动作不处理,模式空间就是1,然后把模式空间的内容覆盖至保持空间 ,保持空间也是1,删除模式空间的1,所以第一轮打印的内容为空;第二轮处理第二行,把保持空间的内容追加到模式空间,此时模式空间就是2,1,然后覆盖至保持空间,保持空间也是2,1,删除模式空间的内容2,1,,也没有打印的内容;以此类推,每一轮执行完毕不删除就是倒序显示,处理一行就是1,处理第二行,就是2,1…….最后一行的最后一轮动作处理完毕不删除,就会显示倒序
4.seq 7 |sed ‘n;d’ 显示奇数
解析:当处理第一行的时候,被第二行覆盖,也就是第一行不处理直接打印,然后删除第二行,然后第四行被删除,第六行被删除,剩下的打印出来,也就是打印奇数行。
5.sed ‘N;D’ 显示最后一行
需要注意的是,N不打印模式空间的值,一轮执行完毕打印出来。
解析:读取匹配到的行的下一行到追加到模式空间,然后删除直到第一个换行符的模式空间的文本。本题的意思就是当读取第一行的时候,把第二行的内容追加进来,此时模式空间只有1,2,两行,也就是只有一个换行符,然后删除直到第一个换行符模式空间的文本,就是留下第二行,第一轮结束;然后追加3进来,模式空间就是2\n3,执行D,模式空间内容就是3,以此类推。
6.seq 5|sed ‘N;p;D’
解析:本题的意思就是读取第一行的时候,追加第二行的内容,打印1,2行,然后执行D删除1,本轮结束;然后追加第三行的内容到模式空间,打印2,3行,执行D删除2,本轮结束;追加第四行内容到模式空间,打印是3,4,执行D 删除3,本轮结束;追加第五行内容到模式空间,打印4,5,执行D,删除4,本轮结束;此时模式空间还有一个数字5,没有数据就不执行了,默认打印出来。
7.sed ‘$!d’ 显示最后一行
解析:这一题比较好理解,就是读取一行删除一行的内容,最后一行不删除。
8.sed ‘G’ 每行之间加空行
解析:每一行后都追加一个空行。
9.sed ‘g’ 把每行内容替换成空行
解析:把每行内容都覆盖成空行输出。
10.sed ‘/^$/d;G’ 确保每一行下面都有一个空行(在每一个非空行下面追加一个空行)
解析:本题比较绕,有一个很大的坑。我们来说说坑在哪,因为sed是逐行处理,所以很多人认为当第一行是空行的时候删除,然后又追加一个空行,那输出的结果不就是空行吗?这样理解是不对的,因为本题有一个地址界定,界定的是空行,当遇到的空行的时候就删除,也就是模式空间的空行都会被删除,剩下的就是不是空行的内容,然后在每一行的下面追加一个空行。
11.sed ‘/^$/d;G;G’
12.seq 5|sed ‘N;d’当为偶数行的时候全部删除完,奇数行的时候,留着最后一行。
sed高级用法

最新推荐文章于 2022-08-03 00:23:48 发布