文档章节

sed之G、H、g、h使用

白志华
 白志华
发布于 2015/09/15 16:40
字数 857
阅读 209
收藏 6

3 月,跳不动了?>>>

sed如何处理数据?

sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed-command(sed命令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行呗输出,模式(pattern space)被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

 

什么是Pattern Space,什么是Hold Space?

pattern space相当于车间sed把流内容在这里处理。

hold space相当于仓库,加工的半成品在这里临时储存。

PS:你可以将pattern space看成是一个流水线,所有的动作都是在“流水线”上执行的;而hold space是一个“仓库”,“流水线”上的东东都可以放到这里。

为什么要使用sed高级命令(G、H、g、h、n、N、x)?

由于各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。

sed命令:

+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除

+ G:[address[,address]]G 将hold space中的内容append到pattern space\n后

+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除

+ H:[address[,address]]H 将pattern space中的内容append到hold space\n后

+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中

+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行

PS:不论是使用G、g还是H、h,它们都是将hold space里面的内容“copy”到pattern space中或者将pattern space中的内容“copy”到hold space中。

附上英文的解释(注意其中的高亮单词):

The "h" command copies the pattern buffer into the hold buffer. The pattern buffer is unchanged.

Instead of exchanging the hold space with the pattern space, you can copy the hold space to the pattern space with the "g" command. This deletes the pattern space. If you want to append to the pattern space, use the "G" command. This adds a new line to the pattern space, and copies the hold space after the new line.

示例一:


#!/bin/bash
file=/tmp/volume_status_$$
ret=/tmp/volume_status_ret_$$

scnas volume status | grep -v "Scnas process" | grep -v "NFS Server" | grep -v "Self-heal" | sed s/'Status of volume: '/'卷名:'/g | grep -v "\-\-\-" | sed s/'Brick '//g >$file

while read line;do
	echo $line | grep "卷名" 1>/dev/null
	if [ $? -ne 0 ];then
		brick=$(echo $line | awk -F ' ' '{printf $1}')
		statu=$(echo $line | awk -F ' ' '{printf $3}')
		if [ X$statu == 'XY' ];then
			statu='在线'
			printf "$brick\t\t$statu\n" >>$ret
		elif [ X$statu == 'XN' ];then
			statu='离线'
			printf "<font color='red'>$brick\t\t$statu</font>\n" >>$ret
		fi
	else
		echo " " >>$ret
		printf "$line\n" >>$ret
		echo "--------------------------" >>$ret
	fi
done <$file
cat $ret
rm -f $file $ret

示例二:用sed模拟出tac的功能(倒序输出)。

文件内容

cat mm
1
2
3

解决方法:

sed ‘1!G;h;$!d’mm

ps:1!G第1行不 执行“G”命令,从第2行开始执行。

       $!d,最后一行不删除(保留最后1行)

图解分析过程

P:Pattern Space

H:Hold Space

蓝色:Hold Space中的数据

绿色:Pattern Space中的数据

参考:

《sed and awk 第二版》



© 著作权归作者所有

白志华
粉丝 34
博文 265
码字总数 57524
作品 0
长沙
程序员
私信 提问
加载中

评论(0)

用bash完成八皇后問題

近来看到几个不是很常见,但是比较有用的sed例子,都和hold space与pattern space有关,于是对几个例子做了自己认为正确的解释,贴出来与大家共享并请指正,继续讨论 例子一 [color=blue]se...

红薯
2009/05/06
240
0
linux sed 命令单行任务快速参考

文本间隔: ——– # 在每一行后面增加一空行 sed G # 将原来的所有空行删除并在每一行后面增加一空行。 # 这样在输出的文本中每一行后面将有且只有一空行。 sed ‘/^$/d;G’ # 在每一行后面...

程序师
2018/07/30
0
0
sed 学习笔记

声明: 这些代码只是为了学习和理解sed命令而为之,并不 代表问题的唯一解或最佳解,希望各位拍砖 参考资 料:等 一. 替换 1.神奇变换(y 命令的使 用) 代码: sed 'y/ori_letter_list/target_let...

长平狐
2012/09/03
135
0
Linux学习----文本三剑客——sed(马哥教育原创)

来源:马哥教育 我以前的文章介绍过grep了,今天我就来说一下第二个sed,它是stream editor的缩写。在Linux的文本文件中文本存储都是一行,显示时表现的多行其实都是因为有换行符的存在,例如...

Py爱好
2018/08/02
123
0
linux sed 批量替换字符串

比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做: sed -i "s/zhangsan/lisi/g" 解释一下: -i 表示inplace edit,就地修改文件 -r 表示搜索子目录 -l 表示输出匹配的文...

走下哦
2018/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA Tomcat 日志乱码解决汇总

IDEA Tomcat 日志乱码解决汇总 第三种没解决,第二种配置后解决了 https://blog.csdn.net/sinat_32404247/article/details/90287700...

三三的宁
今天
18
0
C/C++内存检查

诉求 内存泄漏 内存越界 栈内存越界 堆内存越界 实现 valgrind:除了栈越界外,几乎所有的检查 gcc的sanitize:可以检查包括栈越界在内的几乎所有情况

chuqq
今天
27
0
【附录】1、tapd在公司敏捷开发中的运用

一、概述 公司业务发展较快,业务从无到有,需要快速的迭代和交付,项目流程不规范,开发测试各种问题,随着项目增多,项目管理问题越来越难。 各种问题的频发,让我们对当前的项目协作模式进...

卖小女孩的小火柴
昨天
27
0
Android 上显示 PDF 文件

使用 WebView 配合 pdf.js 在 Android 上显示 PDF 文件 最近在 手机上要显示 PDF 文件,在搜索引擎上找到了很多方案,大体上有以下几种: 使用提供的在线服务,例如 Google 文档预览服务,m...

佛系编码
昨天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部