linux常用命令(9):sed命令(编辑/替换/删除文本)

sed系列文章

  1. linux常用命令(9):sed命令(编辑/替换/删除文本)
  2. linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行
  3. linux sed批量修改替换文件中的内容/sed特殊字符

文章目录

  • sed系列文章
  • 一、简介
    • 1.1、sed 工作过程
  • 二、sed语法
    • 2.1、sed语法
    • 2.2、sed常用选项
    • 2.3、sed定位
    • 2.4、sed正则表达式
    • 2.5、sed操作指令
  • 三、sed语法总结`(重要)`
    • 3.1、sed查找内容(正则表达式的使用)
    • 3.2
  • 四、实际使用/实战
    • 4.1、sed不会破坏源文件(sed 与sed -i)
    • 4.2、替换: s 命令`(重点)`
      • 4.2.1、sed替换内容包含特殊字符
    • 4.3、追加: a命令
    • 4.4、插入: i 命令
    • 4.5、打印:p命令
    • 4.6、删除: d 命令
    • 4.7、指定行的范围:逗号
    • 4.8、修改: c 命令
    • 4.9、退出: q 命令

一、简介

sed(stream editor):流编辑器(流编辑器可以对从管道这样的标准输入接收到的数据进行编辑.)

  • sed 是基于行的,按顺序对每一行执行命令。
  • sed 处理数据时,将一行读入其模式缓冲区,执行编辑命令,再打印模式缓冲区。然后它对后面的每一行重复这些步骤。
  • 再次强调, sed是基于行的,逐行处理数据。

sed(stream editor): sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  • 每次仅读取一行内容;
  • 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  • 将执行结果输出。
    当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

1.1、sed 工作过程

sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
linux常用命令(9):sed命令(编辑/替换/删除文本)_第1张图片
sed默认不会修改源文件,具体下面的3.1中有讲解。

二、sed语法

2.1、sed语法

sed [options] commands [inputfile...]
sed [-n] -f scriptfile files

# 注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才不是0

2.2、sed常用选项

options表示sed命令的一些选项,常见的选项如下表:

选项 说明
-n -n或 --quiet或–silent使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
-e 多重编辑,且命令顺序会影响结果
-f 指定一个 sed 脚本文件到命令行执行
-r Sed 使用扩展正则
-i 直接修改文档读取的内容,不在屏幕上输出
-i.bak 修改文件时会创建备份文件,防止手误。相当于先备份一个.bak的文件然后再执行-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的倍数的下一行

以下显示几个sed定位的示例

sed '1d' filename  # 删除第一行
sed '$d' filename  # 删除最后一行
sed '2,5d' filename # 删除第2到第5行

2.4、sed正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间(/xxx/)
linux常用命令(9):sed命令(编辑/替换/删除文本)_第2张图片

2.5、sed操作指令

sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址, sed 就会处理输入的所有的行。

以下操作指令指的是sed [options] commands [inputfile…]中commands中的指令。

命 令 说 明
a\ 在当前行后添加一行或多行
c\ 用新文本修改(替换)当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间里的内容复制到暂存缓存区
H 把模式空间里的内容追加到暂存缓存区
g 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
G 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始处理
q 结束或退出 sed
r 从文件中读取输入行
对所选行意外的所有行应用命令
s 用一个字符串替换另一个

替换标志

g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区与模式空间的内容

三、sed语法总结(重要)

上面我们引入了很多内容: sed正则、选项、操作指令、sed定位等等。由于引入的操作指令太多,可能都不清楚怎么使用,这里先引入一些常用的语法便于理解。以下整理一下常用的几种语法:

3.1、sed查找内容(正则表达式的使用)

正则表达式是括在斜杠间(/xxx/)的模式

sed [选项] '[address]/pattern/[flag]' filename

其中:

  • address指的的定位,参考上面sed定位的用法
  • flag一般是上面sed操作指令中的值

示例:

sed -n '/root/p' aa.txt   #打印包含root的行  /xxx/是正则表达式的写法
sed -n '10p'  aa.txt      #打印第10行
sed -n '5,10p' aa.txt     #打印第5到第10行
sed -n '5,+5p'  aa.txt   #从第5行开始,往后打印5行,包括第5行
sed -n '8,/sbin\/nologin/p' aa.txt  #打印aa.txt中第8行开始,到含有/sbin/nologin的内容的行结束内容

3.2

四、实际使用/实战

4.1、sed不会破坏源文件(sed 与sed -i)

sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
linux常用命令(9):sed命令(编辑/替换/删除文本)_第3张图片

4.2、替换: s 命令(重点)

命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现, s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换。 更多替换相关的命令参考《linux sed批量修改替换文件中的内容/sed特殊字符》

语法:

sed -i 's/原字符串/替换字符串/g' filename

在这里插入图片描述
说明:

  1. -i:直接修改文件中的内容,不加-i的效果参考3.1
  2. s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个“男”,所有的 “男”都会被替换为 “man”。如果没有 g 命令,则只将每一行的第一个“男”替换为 “man”。

4.2.1、sed替换内容包含特殊字符

假如sed s命令中原字符串与替换字符串中包含特殊字符可以转义,特殊字符包含:/、& 等等。
在这里插入图片描述

4.3、追加: a命令

a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
语法如下:

匹配行后添加
sed -i "/匹配内容/a添加内容 " filename
而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/a\3333333333 " test.txt

sed -i '1a hello world' test.txt  # 1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

linux常用命令(9):sed命令(编辑/替换/删除文本)_第4张图片

4.4、插入: i 命令

i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。

语法如下:

匹配行后添加
sed -i "/匹配内容/i添加内容 " filename
而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/i\3333333333 " test.txt

sed -i '1i hello world' test.txt #命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串,如果i的前面没有地址限定则在所有行的前面都会添加指定的字符串

linux常用命令(9):sed命令(编辑/替换/删除文本)_第5张图片

4.5、打印:p命令

命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,选项-n 用于取消默认打印操纵。当选项-n 和命令 p 同时出现时, sed 可打印选定的内容
linux常用命令(9):sed命令(编辑/替换/删除文本)_第6张图片

4.6、删除: d 命令

命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。 更多d命令用法参考《linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行》

sed -i '1d' filename   删除文件第一行
sed -i '2d' filename   删除第二行
sed -i 'nd' filename   删除第n行/n需要是实际数字
sed -i '$d' filename   删除最后一行
sed -i '1,3d' filename   删除1-3行
sed -i '3,$d' filename  删除第3行到最后一行

sed -i '/^$/d' filename  # 删除所有空白行
编辑命令 含义
1d 删除第1行的内容
1,5d 删除1行到5行的内容
2,+5d 删除第2行以及往下的5行的内容
/pattern1/d 删除每行中匹配到pattern1的行内容
/pattern1/,/pattern2/d 删除匹配到pattern1的行直到匹配到pattern2的所有行内容
/pattern1/,10d 删除匹配到pattern1的行到10行的所有行内容
10,/pattern1/d 删除第10行直到匹配到pattern1的所有内容

4.7、指定行的范围:逗号

行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10),正则表达式(例如/Dick/和/Joe/),或者两者的结合(例如/north/,$)范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
1>行号指定范围
linux常用命令(9):sed命令(编辑/替换/删除文本)_第7张图片
2>正则表达式指定范围
linux常用命令(9):sed命令(编辑/替换/删除文本)_第8张图片

4.8、修改: c 命令

c 命令是修改命令。 sed 使用该命令将已有的文本修改成新的文本。旧文本被覆盖。

sed -i '/Bill/c Billion' test.txt # 将包含Bill的行整行替换为Billion

sed -i '1c hello world' test.txt  #命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,例如:

sed -i '/^2/c hello world' test.txt  #替换以2开头的行,其内容是c命令后面的字符串

linux常用命令(9):sed命令(编辑/替换/删除文本)_第9张图片

4.9、退出: q 命令

q 命令表示退出命令。该命令将导致 sed 程序退出,且不再进行其他的处理。
linux常用命令(9):sed命令(编辑/替换/删除文本)_第10张图片
打印完第 3 行之后, q 让 sed 程序退出





整理本文时发现一些其他文章值得借鉴的: https://blog.csdn.net/bandaoyu/article/details/120047612 https://blog.csdn.net/weixin_42445727/article/details/120431735 https://www.cnblogs.com/A121/p/10621152.html https://www.cnblogs.com/maxincai/p/5146338.html https://www.cnblogs.com/ginvip/p/6376049.html

你可能感兴趣的:(linux,sed命令,sed替换/编辑/删除,linux批量替换文本)