天天看点

sed 流编辑器

sed

目录

一 sed 编辑器1.1sed的工作流程

二:sed 命令使用

2.1 格式

2.2 常用选项

2.3 常用操作

2.4 示例

三:sed 的 寻址方式

3.1 数字形式表示区间3.1.1 sed 的步长

3.2 用文本模式来过滤出行

3.2.1 正则匹配

3.2.2 sed 的打开与关闭

3.3 sed 的 n 读取下一行,及q 退出

3.3.1 n操作,读取下一行

3.3.2 q 退出操作

四: sed 的替换操作

4.1 格式

4.2 s 操作进行替换

4.3 sed与选项 -f 一起使用

4.4 sed 使用 c 操作 整行替换

4.5 sed 使用 y 进行替换

4.6 sed 的字符串分隔符

五 sed 的删除操作

六 插入

6.1 i 行前插入,a 行后插入,r 读入文本

6.2 sed 剪切复制操作

7 使用sed 将字符串互换位置

7.1 将 111 和 222 互换位置

7.2 将第一个字符和最后一个字互换位置

7.3 将ip 地址反向输出

sed 是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流

sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存在在一个命令文件中

sed 的工作流程主要包括 读取,执行 ,显示, 三个过程

读取:sed从输入流(文件,管道,标准输入)中读取一行内容并存储到临时的缓冲区中(又称为模式空间)

执行:默认情况下,所有sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行

显示:发送修改后的内容到输出流。在发送该数据后,模式空间将会被清空。

在所有的文件内容都被处理完之前,上述过程将重复执行,直到所有内容都被处理完

默认情况下所有的sed命令都是在模式空间内执行,因此输入的文件并不会发生任何变化,除非用重定向存储输出

sed 默认只支持基础正则

<code>sed -e '操作' 文件1 文件2 ...</code>

<code>sed -n -e '操作' 文件1 文件2 ....</code>

<code>sed -f 脚本文件 文件1 文件2 ...</code>

<code>sed -i -e '操作' 文件1 文件2</code>

选项

释义

-e 或者 --expression=

表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略一般在执行多个操作命令使用

f 或者--file=

表示用指定的脚本文件来处理输入的文本文件

h 或者 --help

显示帮助

-n , --quit 或者silent

禁止sed 编辑器输出。可以与p命令一起使用完成输出

-r

让sed 支持扩展正则表达式

-s

将输入的文件视为各个独立的文件,而不是一个长的连续输入

-i

直接修改目标文本文件

sed 的操作,如果不加 -i 选项,是不会改变文件内容的

操作

s

替换,替换指定字符

d

删除,删除选定的行

a

增加,在当前行的下面增加一行指定内容

i

插入,在选定行的上面插入一行指定内容

c

替换,将选定行整行替换为指定内容

y

字符转换,转换前后的字符长度必须相同(不能对正则表达式使用)

p

答应,如果同时指定行,表示打印行。如果不指定行,则表示打印所有内容

=

打印行号

l(小写L)

打印数据流中的文本和不可打印的ASCII 字符(如结束符$,制表符 \t)

n

读取下一行内容

q

退出sed程序

取反

h

把模式空间里的内容复制到暂存缓冲区

H

把模式空间里的内容追加到暂存缓冲区

g

把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容

G

把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面

w 文件

将所选的行写入文件

sed 流编辑器

以数字形式表示行区间

<code>sed -n '3p' testfile #打印第三行</code>

用文本模式来过滤出行

<code>sed -n '/a/p' testfile #打印包含a的行</code>

sed 可以用 1,2,3,4 .... 整数表示行。 "$" 可以表示最后一行。

如果想表示从多少行,到多少行, 可以写出开始行和结尾行,中间以逗号"," 隔开.如:sed -n '1p,3p' testfile1 表示打印第一行到第三行

sed 流编辑器

如; sed -n '1~2p' testfile , “1~2p” 表示 从第一行开始打印,步长是2,也就是打印奇数行

sed 流编辑器

sed 可以将要匹配的内容写在斜线"/" 之间 如: sed -n '/a/p' testfile2 表示匹配包含 a 的行并打印

sed 流编辑器

sed 默认支持基础正则。如果使用扩展正则,需要加上选项 -r

sed 流编辑器
sed 流编辑器
sed 流编辑器

sed 先读取了第 1 行,然后执行 了 p 打印操作,打印了第 1 行的内容

之后,再执行 n 操作,读取下一行,也就是读取第 2 行。但是因为后续没有 p 打印操作,所以,第 2 行灭有打印

然后,sed 读取第 3 行内容,执行 p 打印操作,打印 第 3 行内容

之后,再执行n 操作, 读取下一行,也就是读取第 4 行。但是,依旧因为没有p 操作,无法打印出来

sed 流编辑器

sed 先读取第 1 行内容, 因为内有 p 操作,所以,第一行没有打印。

再执行n 命令,读取下一行 ,也就是读取第2 行,之后再执行 p 命令,将第 2 行打印出来

sed 流编辑器

sed 读取 从第 5 行 到 最后一行。中间以 np 的 形式操作。

读取 第 5 行 ,因为没有 p 操作,所以不打印。然后执行 n操作 ,读取下一行的,也就是读取 第6 行。然后再执行 p 打印操作,打印第 6 行

然后 再读取第 7 行,之后,不打印。执行 n 操作,读取下一行,也就是读取第 8 行。然后再执行 p打印操作,打印第8 行。

一直循环,一直到最后一行

sed 流编辑器

sed 工作流程: 读取,执行,打印。

当工作到第5行时,执行完打印的操作后,执行 q 退出操作。

也就是说,sed '5q' testfile1 命令,sed 只读取到第 5行 就终止了工作

行范围 s/旧字符/新字符/替换标记 #字符替换

行范围c 新字符 #整行替换

行范围 y/旧字符串/新字符串 #旧字符串的长度要和新字符串长度一样

替换标记

标记

数字

表明新字符串将替换地基础匹配的地方

表明新字符串将会替换所有匹配的地方

打印与替换命令匹配的行,与 -n 选项一起使用

w 文件

将替换的结果写到文件中

sed 流编辑器
sed 流编辑器
sed 流编辑器
sed 流编辑器

先编写支持sed 命令的脚本

执行sed 命令

选项 -f 后面加上支持sed的脚本文件

<code>[root@host103 test]# sed -n -f 1.sed /etc/passwd</code>

sed 流编辑器
sed 流编辑器

sed 替换时,字符串的分隔符 不是必须为 "/" ,也可以为 “@”,“#” ,“1”,“2”,"a" ,"b" ... 只要保持一致即可

sed 流编辑器
sed 流编辑器
sed 流编辑器
sed 流编辑器
sed 流编辑器
sed 流编辑器

h/H 复制到剪切板,g/G 黏贴到指定行

sed 流编辑器
sed 流编辑器

<code>s/()()/\2\1</code>

使用 ()括号,将模式空间内容整体分段复制到保留空间

再按照一定顺序输出到模式空间

sed 流编辑器
sed 流编辑器
sed 流编辑器