Linux文本三剑客之sed
- 一、sed简介
- 二、工作流程
- 三、sed的常见用法
- 1、常见的sed命令选项
- 2、常见的操作
- 3、基本用法实例
- 3.1 sed查询
- 3.2 sed删除
- 3.3 sed替换sed ‘s/旧字符/新字符/’ :替换每行匹配到的第一个旧字符
- 3.4 sed插入
一、sed简介
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
二、工作流程
sed 的工作流程主要包括读取、执行和显示三个过程。
-
读取:
sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。 -
执行:
默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。 -
显示:
发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
三、sed的常见用法
通常情况下调用 sed 命令有两种格式
sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数
“参数”是指操作的目标文件, 当存在多个操作对象时用,文件之间用逗号“,”分隔;
而 scriptfile 表示脚本文件,需要用“-f” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
1、常见的sed命令选项
选项 | 含义 |
---|---|
-e 或–expression= | 表示用指定命令或者脚本来处理输入的文本文件。 |
-f 或–file= | 表示用指定的脚本文件来处理输入的文本文件。 |
-h 或–help | 显示帮助。 |
-n、–quiet 或 silent | 表示仅显示处理后的结果。 |
-i | 直接编辑文本文件。 |
2、常见的操作
操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间
参数 | 含义 |
---|---|
a | 增加,在当前行下面增加一行指定内容。 |
c | 替换,将选定行替换为指定内容。 |
d | 删除,删除选定的行。 |
i | 插入,在选定行上面插入一行指定内容。 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
s | 替换,替换指定字符 |
y | 字符转换。 |
3、基本用法实例
3.1 sed查询
-
sed -n ‘行号p’ :查看指定行信息
-
sed ‘5q’ :打印前5行信息后退出,q表示退出
-
sed -n ‘行1,行2p’ :查看从行1到行2的信息
-
sed -n ‘行1,+np’ :查看行1及行1后的n行信息
-
sed -n ‘3 {p;n;n;p}’ :n可以帮我们实现换行,p实现打印
-
sed -n ‘/字符串/ p’ :打印包含字符串的行
-
sed -n ‘/正则表达式/ p’ :打印所有包含正则能够匹配到的内容的行
sed -n ‘行号p’ :查看指定行信息
sed -n ‘行1,行2p’ :查看从行1到行2的信息
sed -n ‘行1,+np’ :查看行1及行1后的n行信息
sed -n ‘3 {p;n;n;p}’ :n可以帮我们实现换行,p实现打印
sed -n ‘/字符串/ p’ :打印包含字符串的行
sed -n ‘/正则表达式/ p’ :打印所有包含正则能够匹配到的内容的行
3.2 sed删除
-
sed ‘行号 d’ : 删除指定行号的行
-
sed ‘行1,行2 d’ : 删除行1与行2之间的行
-
sed ‘/字符串/ d’ :删除包含字符串的行
-
sed ‘/正则表达式/ d’ :删除所有包含正则能够匹配的到的内容的行
-
sed ‘行号,/字符串/ d’ :删除从指定行到第一个包含字符串的行
-
sed ‘/字符串1/,/字符串2/ d’ :从第一个字符串1的行开始删除到 第一个扫描到的字符串2的行,之后会继续扫描包含字符串1的行,然后继续执行删除和扫描字符串2的操作
sed ‘行号 d’ : 删除指定行号的行
sed ‘行1,行2 d’ : 删除行1与行2之间的行
sed ‘/字符串/ d’ :删除包含字符串的行
sed ‘/正则表达式/ d’ :删除所有包含正则能够匹配的到的内容的行
sed ‘行号,/字符串/ d’ :删除从指定行到第一个包含字符串的行
sed ‘/字符串1/,/字符串2/ d’ :从第一个字符串1的行开始删除到 第一个扫描到的字符串2的行,之后会继续扫描包含字符串1的行,然后继续执行删除和扫描字符串2的操作
3.3 sed替换sed ‘s/旧字符/新字符/’ :替换每行匹配到的第一个旧字符
- sed ‘s/旧字符/新字符/n’ : 替换每行匹配到的第n个旧字符
- sed ‘s/旧字符/新字符/g’ :替换每行匹配到的所有旧字符
- sed ‘s/旧字符/新字符/w file’ :把替换后的行内容保存到指定文件
- sed -n ‘s/旧字符/新字符/gp’ > file
- sed ‘行号 s/旧字符/新字符/’ : 替换指定行的第一个匹配到的的字符串 最后加上g就是替- 换所有匹配到的旧字符
- sed ‘行1,行2 s/旧字符/新字符/g’ :替换行1与行2区间的匹配行的对应的字符串
- sed ‘/字符串/ s/旧字符/新字符/g’
- sed ‘/正则表达式/ s/旧字符/新字符/g’
- s/xx/xx/:后面的替换分隔符可以使用其他字符代替,需要确保三个分隔字符保持一致
- sed ‘行号c xxxx’ 替换指定行的整行内容
- sed ‘y/abc/123/’ 替换所有相对应的字符功能类似tr
sed ‘s/旧字符/新字符/替换选项’ 替换选项可以指定第几个旧字符进行替换,g表示全行替换
sed ‘s/旧字符/新字符/w file’ :把替换后的行内容保存到指定文件
sed -n ‘s/旧字符/新字符/gp’ > file
sed ‘行号 s/旧字符/新字符/’ : 替换指定行的第一个匹配到的的字符串 最后加上g就是替- 换所有匹配到的旧字符
sed ‘行1,行2 s/旧字符/新字符/g’ :替换行1与行2区间的匹配行的对应的字符串
sed ‘/字符串/ s/旧字符/新字符/g’
sed ‘/正则表达式/ s/旧字符/新字符/g’
s/xx/xx/:后面的替换分隔符可以使用其他字符代替,需要确保三个分隔字符保持一致
sed ‘行号c xxxx’ 替换指定行的整行内容
sed ‘y/abc/123/’ 替换所有相对应的字符功能类似tr
3.4 sed插入
-
sed ‘行号i xxxx’ :在指定行上面插入xxxx
-
sed ‘行号a xxxx’ :在指定行下面插入xxxx
-
sed ‘行号r file’ :在指定行下面读取文件内容
-
sed ‘/root/{H;d};$G’ /etc/passwd :将包含root的行剪切到末尾,H表示复制;G表示粘贴
-
sed ‘1,2H;3,4G’ /etc/passwd :将1到2行复制到3和4行下面
-
echo “111222333” | sed -r ‘s/(111)(222)/\2\1/’ :将字符111和222互换位置
sed ‘行号i xxxx’ :在指定行上面插入xxxx
sed ‘行号a xxxx’ :在指定行下面插入xxxx
sed ‘行号r file’ :在指定行下面读取文件内容
sed ‘/行数/{H;d};$G’ :将指定行剪切到末尾,H表示复制;G表示粘贴
sed ‘1,2H;3,4G’ :将1到2行复制到3和4行下面
echo “111222333” | sed -r ‘s/(111)(222)/\2\1/’ :将字符111和222互换位置