sed——保持空间和模式空间

1. 概念

sed 有两个内置的存储空间:

l  模式空间: 如你所知,模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一

个缓冲区,用来存放、修改从输入文件读取的内容。

l  保持空间: 保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间

和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。我们已经讨论

过,每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容

则保持不变,不会在循环中被删除。

 

2. 交换 x命令

### 命令x(exchange) 用于交换模式空间和保持空间的内容

 

3. 模式空间复制到保持空间 h命令

### 命令h(hold), 与x命令不同在于不会改变模式空间当前内容,保持空间的内容会被覆盖

[root@tyler temp]# cat empname.txt

John

Doe

CEO

Jason Smith

IT Manager

Raj Reddy

Sysadmin

Anand Ram

Developer

Jane Miller

Sales Manager

[root@tyler temp]# sed -n -e '/Manager/!h' -e'/Manager/{x;p}' empname.txt

Jason Smith

Jane Miller

[root@tyler temp]#
######################################################################################

# 逐行的读取,'/Manager/!h'表示遇到不包含Manager关键字的行,就复制到保持空间(注意是覆盖了保

# 持空间原有的内容),'/Manager/{x;p}'表示遇到包含Manager关键字的一行,就与保持空间交换并打印  

# 交换后的模式空间内容(打印内容就是上一行,也就是Manager的姓名)。

######################################################################################

 

4. 模式空间追加到保持空间 H命令

### 同时管理者姓名和职位
[root@tyler temp]# sed -n '/Manager/!h;/Manager/{H;x;p}' empname.txt

Jason Smith

IT Manager

Jane Miller

Sales Manager

[root@tyler temp]#
### 格式化为一行

[root@tyler temp]# sed -n '/Manager/!h;/Manager/{H;x;s/\n/: /p}' empname.txt

Jason Smith: IT Manager

Jane Miller: Sales Manager

[root@tyler temp]#

 

5. 保持空间复制到模式空间 g命令

### 打印管理者的姓名

[root@tyler temp]# sed -n '/Manager/!h;/Manager/{g;p}' empname.txt

Jason Smith

Jane Miller

[root@tyler temp]#

 

6. 保持空间追加到模式空间 G命令

### 格式打印管理者及其职位
[root@tyler temp]# sed -n '/Manager/!h;/Manager/{x;G;s/\n/: /p}' empname.txt

Jason Smith: IT Manager

Jane Miller: Sales Manager

[root@tyler temp]#
 

######################################################################################

# m代表模式空间,h表示保持空间

# 先交换(m中为姓名,h为职位),再h追加到m中(m中姓名和职位分行排列),最后替换换行符

######################################################################################

 

7. 读取下一行数据附加到模式空间 N命令

### n打印当前模式空间内容并清空,读取下一行到模式空间
### N不打印不清空,读取下一行追加到模式空间

[root@tyler temp]# sed -n 'N;s/\n/: /p' empname.txt

John: Doe

CEO: Jason Smith

IT Manager: Raj Reddy

Sysadmin: Anand Ram

Developer: Jane Miller

 

8. 打印多行模式中的第一行 P命令

### p打印模式空间的内容
### P打印模式空间的第一行

[root@tyler temp]# sed -n 'N;/Manager/P' empname.txt

Jason Smith

Jane Miller

[root@tyler temp]# sed -n 'N;/Manager/l' empname.txt

Jason Smith\nIT Manager$

Jane Miller\nSales Manager$

[root@tyler temp]#

 

######################################################################################

# 'N' 将下一行追加到当前行(相当于每两行合并成一行,来执行第二条命令,并没有删掉换行符),

# '/Manager/P' 会匹配是否包含Manager, 如果包含P打印至换行符'\n'(也就是管理者姓名)

######################################################################################

 

9. 删除多行模式中的第一行 D命令

### d 删除模式空间的内容,然后读取下一行到空间,并且忽略后边的命令,进行新一次的循环
### D 删除模式空间的第一行,不读取下一行,忽略后边的命令,在当前空间从头执行命令

 

10.        命令b :label标签 t命令

### :label 定义一个标签
### b label 会跳转到label标签执行其之后的命令
# 格式打印,并在管理者前加*号
[root@tyler temp]# sed -n '{

> N;

> s/\n/: /

> /Manager/!b end

> s/^/*/

> :end

> p}' empname.txt

John: CEO

*Jason Smith: IT Manager

Raj Reddy: Sysadmin

Anand Ram: Developer

*Jane Miller: Sales Manager

[root@tyler temp]#
 

######################################################################################

# 这里定义了一个end标签,后边接了一个命令p

# 第三行匹配Manager关键字,不匹配的直接跳转到end标签之后

# 匹配的会先执行替换开头为*的操作,然后再执行后边的命令

######################################################################################

### t label 如果前面命令执行成功,会跳转到 label标签往下执行后续命令
### 否则,按正常流程执行

[root@tyler temp]# sed -n '{

N;

s/\n/: /;

:repeat;

/Manager/s/^/*/

/\*\*\*/!t repeat

p }' empname.txt

John: CEO

***Jason Smith: IT Manager

Raj Reddy: Sysadmin

Anand Ram: Developer

***Jane Miller: Sales Manager

[root@tyler temp]#


######################################################################################

# 定义了一个repeat标签

# /Manager/s/^/*/ 是循环块,给包含Manager行前加*号
# /\*\*\*/!t repeat 匹配是否包含三个*号的行,不包含跳转回repeat标签处
# 包含了的话,往下执行

######################################################################################

 

 

你可能感兴趣的:(linux)