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 脚本文件到命令行执行,
-rSed 使用扩展正则
-i直接修改文档读取的内容,不在屏幕上输出

2.3 sed定位

Sed 命令在没有给定的位置时,默认会处理所有行
Sed 支持以下几种地址类型:

指令说明
first~stepfirst 指起始匹配行, 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指令用法详解的主要内容,如果未能解决你的问题,请参考以下文章

linux之文本内容替换命令sed

关于Linux里的sed命令。

Linux之Shell编程(14)--sed关键字详解演示

Linux之Shell编程(14)--sed关键字详解演示

linux sed命令参数及用法详解

sed详解---用法及解释