Sed 流文本编辑器

(一)Sed流文本编辑器介绍

    sed (Stream EDitor) 本质上是一个编辑器,但是它是非交互式的,这点与VIM不同;同时它又是面向字符流的,输入的字符流经过sed的处理后输出。这两个特性使得sed成为命令行下面非常有用的一个处理工具,同时sed能够完美的配合正则表达式使用。

这里先谈一下交互式和非交户式的编辑器。

Vim:需要进到文本里面进行操作。

sed:不需要进行到文本里面进行操作。

    而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。这个就是流编辑器。

最后,sed能够非常完美的配合正则表达式使用。

(二 )Sed流文本编辑器的格式

sed命令的格式:

sed [options] ' script' inputfile(s)

    options是指sed的命令行参数,这一块并不是重点,参数也不多。

   script是指需要对输入执行的一个或者多个操作指令(instruction),sed会依次读取输入文件的每一行到缓存中并应用script中指定的操作指令,因此而带来的变化并不会影响最初的文件(注:如果使用sed时指定-i参数则会影响最初的文件)。

  同大多数Linux命令一样,sed也是从stdin中读取输入,并且将输出写到stdout,但是当filename被指定时,则会从指定的文件中获取输入,输出可以重定向到文件中,但是需要注意的是,该文件绝对不能与输入的文件相同。

如果操作指令很多,为了不影响可读性,可以将其写到文件中,并通过-f参数指定scriptfile:

sed -f scriptfile filename

    这里有一个建议,在命令行中指定的操作指令最好用单引号引起来,这样可以避免shell对特殊字符的处理(如空格、$等)。这个建议同样适用grep/awk等命令,当然如果有时候确实不适合使用单引号时,记得对特殊字符转义。

Sed选项:

–n 要读取的行号,可以关闭自动打印
-e 执行多个sed 命令
-f 运行脚本
-i 编辑文件内容
-i.bak 编辑的同时创造.bak的备份
-r 使用扩展的正则表达式

Sed命令

1 基本命令

p 打印当前模式空间的内容,追加到默认输出之后 \n
d 删除模式空间匹配的行,并进行下一轮循环
a 在匹配后追加文本,支持使用\n来实现多行追加
i 在匹配行前面加入文本
c 替换,把选定的行改为新的文本
w 保存模式匹配的行,到新的文件中。w/pattern/file
r 读取文件/一行,相当于在符合的行后面追加文件/行。

2 替换命令:

s///:查找替换,支持使用其它分隔符,s@@@,s###

    g 在行内进行全局替换

  不加g替换行内第一个符合的字符串。

3 高级命令

N 追加下一行内容到当前行\n后面
D 删除\n 之前的内容
P打印当前模式空间开端至\n的内容,并追加到默认输出之前

4  操作保持空间的命令

操作保持空间的命令如下所示:
h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H 将pattern space中的内容append到hold space\n后
g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G 将hold space中的内容append到pattern space\n后
x 交换模式空间和保持空间的内容

总结如下表:

名称

命令

说明

保存(Hold)

h/H

将模式空间的内容复制或者追加到保持空间

取回(Get

g/G

将保持空间的内容复制或者追加到模式空间

交换(Exchange

x

交换模式空间和保持空间的内容

(三)Sed命令执行流程

    无论是将操作指令通过命令行指定,还是写入到文件中作为一个sed脚本,必须包含至少一个指令,否则用sed就没有意义了。一般会同时指定多个操作指令,这时候指令之间的顺序就显得非常重要。而你的脑海中必须有这么一个概念,即每个指令应用后,当前输入的行会变成什么样子。要做到这一点首先必须要了解sed的工作原理,要做到“知其然,且知其所以然”。

  每条操作指令(instruction由pattern和procedure两部分组成,pattern一般是用'/'分隔的正则表达式,而procedure则是一连串编辑命令(action)。

sed的处理流程,简化后是这样的:

1 读入新的一行内容到缓存空间;

2 从指定的操作指令中取出第一条指令,判断是否匹配pattern;

3 如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;

4 如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;

5 当所有指令都应用之后,输出缓存行的内容;

6 回到第1步继续读入下一行内容;

如下图所示:

(四)Sed命令地址的选择

(一)‘ script ’ :分为地址和命令

地址定界:

1 不给地址:对全文进行处理

2 单地址:

  num:指定的行

  $ 最后一行,

  /pattern/:被此处模式所能匹配的每一行

3地址范围:

num1num2

num1+num2

/pat1//pat2/

num/pat1/

4 步进

1~2奇数行

2~2偶数行

PS: 如果地址后面有一个感叹号(!),则将编辑命令应用到不匹配该地址的所有行

 

发布了117 篇原创文章 · 获赞 185 · 访问量 105万+

猜你喜欢

转载自blog.csdn.net/shuaigexiaobo/article/details/84937095
今日推荐