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命令
### 同时管理者姓名和职位 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命令
### 格式打印管理者及其职位 Jason Smith: IT Manager Jane Miller: Sales Manager [root@tyler temp]# ###################################################################################### # m代表模式空间,h表示保持空间 # 先交换(m中为姓名,h为职位),再h追加到m中(m中姓名和职位分行排列),最后替换换行符 ###################################################################################### |
7. 读取下一行数据附加到模式空间 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打印模式空间的内容 [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 删除模式空间的内容,然后读取下一行到空间,并且忽略后边的命令,进行新一次的循环 |
10. 命令b 和 :label标签和 t命令
### :label 定义一个标签 > 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标签之后 # 匹配的会先执行替换开头为*的操作,然后再执行后边的命令 ###################################################################################### [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行前加*号 ######################################################################################
|