Linux高级文本处理之sed(四)

模式空间是sed内部维护的一个缓存空间,它存放着读入的一行或者多行内容。但是模式空间的一个限制是无法保存模式空间中被处理的行,因此sed又引入了另外一个缓存空间——模式空间(Hold Space)。

一、保持空间

保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间。sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容。

操作保持空间的命令如下所示:

这几组命令提供了保存、取回以及交换三个动作,交换命令比较容易理解,保存命令和取回命令都有大写和小写两种形式,这两种形式的区别是小写的是将会覆盖目的空间的内容,而大写的是将内容追加到目的空间,追加的内容和原有的内容是以\n分隔。

二、基本使用

实例1:h命令使用

[[email protected] ~]# cat text 
1
2
11
22
111
222

[[email protected] ~]# sed ‘h‘ text 
1
2
11
22
111
222

实例2:G命令使用

[[email protected] ~]# sed ‘G‘ text 
1

2

11

22

111

222

[[email protected] ~]#

说明:实例1返回结果正常,因为复制到保持空间的内容并没有取回;实例2每一行的后面都多了一个空行,原因是每行都会从保持空间取回一行,追加(大写的G)到模式空间的内容之后,以\n分隔。

实例3:使用x命令交换空间

[[email protected] ~]# sed ‘x‘ text 

1
2
11
22
111
  • 当读入第一行的时候,模式空间中的内容是第一行的内容,而保持空间是空的,这个时候交换两个空间,导致模式空间为空,保持空间为第一行的内容,因此输出为空行;
  • 当读入下一行之后,模式空间为第2行的内容,保持空间为第一行的内容,交换后输出第1行的内容;
  • 依次读入每一行,输出上一行的内容;
  • 直到最后一行被读入到模式空间,交换后输出倒数第二行的内容,而最后一行的内容并没有输出,此时命令执行结束。

高级命令执行过程图解:

sedsed调试过程:

[[email protected] ~]# sedsed -d ‘H;g‘ num
PATT:a$
HOLD:$
COMM:H
PATT:a$
HOLD:\na$
COMM:g
PATT:\na$
HOLD:\na$
a
PATT:b$
HOLD:\na$
COMM:H
PATT:b$
HOLD:\na\nb$
COMM:g
PATT:\na\nb$
HOLD:\na\nb$
a
b
PATT:c$
HOLD:\na\nb$
COMM:H
PATT:c$
HOLD:\na\nb\nc$
COMM:g
PATT:\na\nb\nc$
HOLD:\na\nb\nc$
a
b
c

三、流程控制命令

为了使使用者在书写sed脚本的时候真正的"自由",sed还允许在脚本中用":"设置记号,然后用"b"和"t"命令进行流程控制。顾名思义,"b"表示"branch","t"表示"test";前者就是分支命令,后者则是测试命令。 首先来看标签的各式是什么。这个标签放置在你希望流程所开始的地方,单独放一行,以冒号开始。冒号与标签之间不允许有空格或者制表符,标签最后如果有空格的话,也会被认为是标签的一部分。 再来说b命令。它的格式是这样的:

[address]b[label]

它的含意是,如果满足address,则sed流程跟随标签跳转:如果标签指明的话,脚本首先假设这个标签在b命令以下的某行,然后转入该行执行相应的命令;如果这个标签不存在的话,控制流程就直接跳到脚本的末尾。否则继续执行后续的命令。 在某些情况下,b命令和!命令有些相似,但是!命令只能对紧挨它的{}中的内容起作用,而b命令则给予使用者足够的自由在sed脚本中选择哪些命令应该被执行,哪些命令不应该被执行。下面提供几种b命令的

经典用法:

(1) 创建循环:

:top
command1
command2
/pattern/b top
command3

(2) 忽略某些不满足条件的命令:

command1
/patern/b end
command2
:end
command3

(3) 命令的两个部分只能执行其中一个:

command1
/pattern/b dothere
command
b
:dothere
command3

t命令的格式和b命令是一样的:

[address]t[label]

它表示的是如果满足address的话,sed脚本就会根据t命令指示的标签进行流程转移。而标签的规则和上面讲的b命令的规则是一样的。下面也给出一个例子:

s/pattern/replacement/
t break
command
:break

四、sed实战

实例1:使用sed模拟出tac的功能(倒序输出)

[[email protected] ~]# cat num
1
2
3
4
5
[[email protected] ~]# sed ‘1!G;h;$!d‘ num
5
4
3
2
1

实例2:行列转换

[[email protected] ~]# cat num
    1
    2
    3
    4
    5

[[email protected] ~]# sed -ne ‘H;${x;s/\n/ /g;p}‘ num
 1 2 3 4 5

实例3:行列转换100之内数字求和

[[email protected] ~]# seq 100|sed -ne ‘H;${x;s/\n/+/g;s/^+//p}‘|bc
5050

实例4:追加匹配行到行尾

[[email protected] ~]# cat file
0
1 hello
2
3 hello
4
5
[[email protected] ~]# sed -e ‘/hello/{H;d}‘ -e ‘$G‘ file 
0
2
4
5

1 hello
3 hello

实例5:在文件中每行后面加空白行

[[email protected] ~]# cat num
1
2
3
4
5
[[email protected] ~]# sed ‘G‘ num
1

2

3

4

5

[[email protected] ~]#

实例6:保留文件最后一行

[[email protected] ~]# sed ‘$!d‘ num
5

实例7:保留文件的每一行后方有且只有一个空白行

[[email protected] ~]# cat /etc/issue
\S
Kernel \r on an \m

Geek Young Learning Services
http://www.geekyoung.com

[[email protected] ~]# sed ‘/^$/d;G‘ /etc/issue
\S

Kernel \r on an \m

Geek Young Learning Services

http://www.geekyoung.com

实例8:保留奇数行

[[email protected] ~]# cat num
1
2
3
4
5
[[email protected] ~]# sed ‘n;d‘ num
1
3
5

实例9:去基名

[[email protected] ~]# echo ‘/etc/sysconfig/network-scripts‘|sed -r ‘[email protected]^.*/([^/]+)/[email protected]\[email protected]‘
network-scripts

实例10:取目录名

[[email protected] ~]# echo ‘/etc/sysconfig/network-scripts/‘|sed -r ‘[email protected][^/]+/[email protected]@‘
/etc/sysconfig/

总结:sed高级用法灵活多变,使用前要搞清楚模式空间的内容,以及sed命令的执行过程,到此sed用法就结束了,要想灵活使用sed还得多练。

时间: 2024-11-03 22:14:08

Linux高级文本处理之sed(四)的相关文章

Linux高级文本处理之sed(一)

sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上.还可以对原文件改动,但是不会再屏幕上返回结果. 基本概念 一.sed命令的语法如下所示: sed [options] script filename sed命令的选项(option): -n :只打印模式匹配的行 -e :多脚本运行,多点编辑,例如 -e script1 -e scrip

Linux高级文本处理之gawk分支和循环(四)

一.if 结构 1.单条语句 语法: if(conditional-expression ) action if 是关键字 conditional-expression 是要检测的条件表达式 action 是要执行的语句 2.多条语句 如果要执行多条语句,需要把他们放在{ } 中,每个语句之间必须用分号或换行符分开,如下所示. 语法: if (conditional-expression) { action1; action2; } 如果条件为真,{ } 中的语句会依次执行.当所有语句执行完后,

Linux 的文本处理工具---sed

                sed 处理文本工具 一.概述 Stream EDitor,行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等  sed 是一种非

Linux高级文本处理之gawk实战(七)

1.取出linux中eth0的IP地址 [[email protected] ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 192.168.1.8 说明: "+"为正则表达式模式匹配至少重复一次. 2.统计文件中所有行单词出现的次数 [[email protected] ~]# awk ' >{for(i=1;i<=NF;i++) >{count[$i]++}} >END{for(j in count)

Linux高级文本处理命令

cut 一.cut命令 功能:cut命令可以从一个文本文件/文本流中提取文本列 语法: cut -d '分割字符' -f fields ##用于有特定分割字符 cut -c 字符区间 ##用于排列整齐的信息 选项与参数: -d:后面接分隔字符.与 -f 一起使用: -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思 -c:以字符(charaters)的单位取出固定字符区间 sed awk 原文地址:https://www.cnblogs.com/xiaowenshu/

Linux 高级文本处理命令

1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields     ## 用于有特定分隔字符 [root@www ~]# cut -c 字符区间            ## 用于排列整齐的信息 选项与参数: -d:后面接分隔字符.与 -f 一起使用: -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思: -c:以字符 (characters) 的单位取出固定字符区间

Linux高级文本处理之gawk内置变量(一)

一.FS –输入字段分隔符 FS是awk内置变量,用来制定行分隔符,功能能-F一样,区别在于FS只能用在BEGIN语句块当中,命令格式如下: BEGIN{FS="SEPARATOR"} 实例1: [[email protected] ~]# awk 'BEGIN { FS=","; print "---------------------------\nName\tTitle\n------------------------"} {print 

处理文本的工具sed,vim 编辑器的使用 &nbsp; Linux版

处理文本的工具sed Stream EDitor 行编辑器 sed一次处理一行的内容,处理时,将当前处理的行存储在临时缓冲区,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,将缓冲区的内容送往屏幕,接着处理下一行不断重复,直到末尾. 一次处理一行 文件--->内存空间--->屏幕 模式空间 文件--->内存空间--->屏幕 | 保持空间 sed   -n:不输出模式空间内容的自动打印 -e:多点编辑 -f:/PATH/TO/SCRIPT_FIL

Linux文本处理之sed

Linux文本处理之sed 上一篇我介绍了文本处理grep,现在我来介绍一下文本处理三剑客的第二剑客--sed. sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作.sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed 的具体用法,但是个人觉得没有必要去学习它的每个细节,那样没有特别大的实际意义.sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令