sed指令用法详解
Posted Overboom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed指令用法详解相关的知识,希望对你有一定的参考价值。
1. sed的作用
sed(stream editor)sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
- 将执行结果输出。
当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
2. sed知识点
2.1 sed语法
1> sed命令行格式语法:
sed [option] 'command(s)' files
2> sed脚本文件语法
sed [-n] -f scriptfile files
2.2 sed常用选项
选项 | 说明 |
---|---|
-n | 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行 |
-e | 多重编辑,且命令顺序会影响结果 |
-f | 指定一个 sed 脚本文件到命令行执行, |
-r | Sed 使用扩展正则 |
-i | 直接修改文档读取的内容,不在屏幕上输出 |
2.3 sed定位
Sed 命令在没有给定的位置时,默认会处理所有行
Sed 支持以下几种地址类型:
指令 | 说明 |
---|---|
first~step | first 指起始匹配行, step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12… |
$ | $符表示匹配最后一行 |
/REGEXP/ | 表示匹配正则那一行,通过//之间的正则来匹配 |
\\cREGEXPc | 这个是表示匹配正则那一行,通过\\c 和 c 之间的正则来匹配,c 可以是任一字符 |
addr1, add2 | 定址 addr1, add2 决定用于对哪些行进行编辑。地址的形式可以是数字、正则表达式或二者的结合。如果没有指定地址, sed 将处理输入文件中的所有行。如果定址是一个数字,则这个数字代表行号,如果是逗号分隔的两个行号,那么需要处理的定址就是两行之间的范围(包括两行在内)。范围可以是数字,正则或二者组合。 |
addr1, +N | 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行 |
addr1, ~N | 将匹配addr1和addr1后面的行,直到输入行号为N的倍数的下一行 |
2.4 sed正则表达式
2.5 sed操作指令
sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址, sed 就会处理输入的所有的行。
命 令 | 说 明 |
---|---|
a\\ | 在当前行后添加一行或多行 |
c\\ | 用新文本修改(替换)当前行中的文本 |
d | 删除行 |
i\\ | 在当前行之前插入文本 |
h | 把模式空间里的内容复制到暂存缓存区 |
H | 把模式空间里的内容追加到暂存缓存区 |
g | 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容 |
G | 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始处理 |
q | 结束或退出 sed |
r | 从文件中读取输入行 |
! | 对所选行意外的所有行应用命令 |
s | 用一个字符串替换另一个 |
2.6 替换标志
g | 在行内进行全局替换 |
p | 打印行 |
w | 将行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符转换为另一字符(不能对正则表达式使用 y 命令) |
3. 实际需求举例 / 实战学习
3.1 打印:p命令
命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,选项-n 用于取消默认打印操纵。当选项-n 和命令 p 同时出现时, sed 可打印选定的内容
3.2 删除: d 命令
命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。
1> 删除单行
2> 删除多行
3.3 替换: s 命令
命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现, s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换。
说明:s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个west,所有的 west 都会被替换为 north。如果没有 g 命令,则只将每一行的第一个west 替换为 north。
3.4 指定行的范围:逗号
行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10),正则表达式(例如/Dick/和/Joe/),或者两者的结合(例如/north/,$)范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
1>行号指定范围
2>正则表达式指定范围
3.5 多重编辑: e 命令
选项-e 用于进行多重编辑。第一重编辑编辑删除第 1~3 行。第二重编辑将Jack 替换为 Billion.因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。
3.6 追加: a 命令
a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
在100的后面加上Hello。
3.7 插入: i 命令
i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。
3.8 修改: c 命令
c 命令是修改命令。 sed 使用该命令将已有的文本修改成新的文本。旧文本被覆盖。
c 命令是修改命令。该命令将完整地修改在模式缓冲区行的当前行。如果模式 Bill被匹配, c 命令将其后的文本替换包含 Bill 的行。
3.9 退出: q 命令
q 命令表示退出命令。该命令将导致 sed 程序退出,且不再进行其他的处理。
打印完第 5 行之后, q 让 sed 程序退出
参看链接:
https://www.cnblogs.com/ginvip/p/6376049.html
https://www.yiibai.com/sed/sed_strings.html
https://blog.csdn.net/yue_2018/article/details/89784442
以上是关于sed指令用法详解的主要内容,如果未能解决你的问题,请参考以下文章