Linux sed命令 - 编辑/替换/删除文本

1、sed命令介绍

sed全称为Stream EDitor,行编辑器,同时也是一种流编辑器,它一次处理一行内容。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

  • 1、sed 是基于行的,按顺序对每一行执行命令。
  • 2、sed 处理数据时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
  • 3、它是文本处理中非常重要的工具,且可以完美配合正则表达式使用,功能强大!

2、sed基本语法

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

3、sed常用选项

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

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

3、sed地址定位

sed 命令在没有给定的位置时,默认会处理所有行。

sed 支持以下几种地址类型:

指令 说明
first~step      first 指起始匹配行, step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12…
$ $符表示匹配最后一行
/REGEXP/ 表示匹配正则那一行,通过//之间的正则来匹配
\cREGEXPc 这个是表示匹配正则那一行,通过\c 和 c 之间的正则来匹配,c 可以是任一字符
addr1,addr2 定址 addr1, add2 决定用于对哪些行进行编辑。地址的形式可以是数字、正则表达式或二者的结合。如果没有指定地址, sed 将处理输入文件中的所有行。如果定址是一个数字,则这个数字代表行号,如果是逗号分隔的两个行号,那么需要处理的定址就是两行之间的范围(包括两行在内)。范围可以是数字,正则或二者组合。
addr1, +N 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行
addr1, ~N 将匹配addr1和addr1后面的行,直到输入行号为N的倍数的下一行
# 地址定位示例:
sed '1d' filename   # 删除第一行
sed '$d' filename   # 删除最后一行
sed '2,5d' filename # 删除第2到第5行

4、sed正则表达式

sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间(/xxx/)

5、sed操作指令

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

指令 说明
a\ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c\ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d 删除,因为是删除啊,所以 d 后面通常不接任何咚咚
i\ 在当前行之前插入文本
p 打印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作
h 把模式空间里的内容复制到暂存缓存区
H 把模式空间里的内容追加到暂存缓存区
g 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
G 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
q 结束或退出 sed
s 替换,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

6、示例理解

# 批量修改文件中的内容
sed -i 's/原字符串/替换字符串/g' filename

# 批量修改文件中的内容
sed -i '[address]s/pattern/replacement/flags' filename
替换标志 flags 说明
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区与模式空间的内容
n 1~512 之间的数字,表示指定要替换的字符串在一行中出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
\n 匹配第 n 个子串,该子串之前在 pattern 中用 指定。
|转义(转义替换部分包含:&、\ 等)。
# 将aa.txt文件中所有的男替换为man
sed -i 's/男/man/g' aa.txt

# 示例1:将|替换为&。 字符中包含&,对&进行转义
sed -i 's/|/\&/g' *.txt

# 示例2:将/app/name替换为/user/demo 。字符串中包含/,对/进行转义
sed -i 's/\/app\/name/\/user\/demo/g' *.txt

# 使用/进行分割,sed是允许其他分隔符的:不论什么字符,紧跟着s后面的都会被认为是分隔符。
[root ~]$ echo "this is /a/b/c" | sed 's#/a/b/c#/x/y/z#g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's@/a/b/c@/x/y/z@g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's!/a/b/c!/x/y/z!g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's|/a/b/c|/x/y/z|g'
this is /x/y/z
[root ~]$ echo "this is /a/b/c" | sed 's_/a/b/c_/x/y/z_g'
this is /x/y/z

# 特殊字符的使用/替换指定的行。
sed 's/^/添加的头部&/g'      #在所有行首添加/注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/$/&添加的尾部/g'      #在所有行末添加 
sed '2s/原字符串/替换字符串/g'  #替换第2行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'

#查找文件并替换内容
sed -i "s/查找字段/替换字段/g" ``grep 查找字段 -rl 路径``

#修改文件的同时备份文件
sed -i.bak 's/原字符串/替换字符串/g' filename

# 修改每一行第二次出现的内容
sed -i 's/原字符串/替换字符串/2' filename

# 修改每一行第二次到最后的内容
sed -i 's/原字符串/替换字符串/2g' filename

#下面的例子是将数据流中的前两行打印到一个文本文件中:
sed '1,2w test.txt' data6.txt
sed 's/test/trial/w test.txt' data.txt  #将命中的内容保存到test.txt文件中

#匹配行后添加 追加: a命令 当前行后面插入新的文本
sed -i "/匹配内容/a添加内容 " filename
#而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/a\3333333333 " test.txt
sed -i '1a hello world' test.txt  # 1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

#匹配行后添加 插入: i 命令 当前行前面插入新的文本
sed -i "/匹配内容/i添加内容 " filename
#而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/i\3333333333 " test.txt
sed -i '1i hello world' test.txt #命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串,如果i的前面没有地址限定则在所有行的前面都会添加指定的字符串

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  # 删除所有空白行

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

sed '3q' test.txt 打印完第 3 行之后, q 让 sed 程序退出

sed 's/[a-z]/\u&/g' 1.txt  # 所有小写字母 替换为大写
sed 's/[A-Z]/\l&/g' 1.txt  # 大写字母 替换为小写
sed 's/\b[a-z]/\u&/g' 3.txt # 第一个小写字母变大写

sed '/^$/'d 1.txt     # 删除空行
sed  's/^[ \t]*//g'   # 删除行首空格 
sed  's/[ \t]*$//g'   # 删除行末空格 
sed  's/[[:space:]]//g'  #删除所有的空格 

评论

评论列表

暂无评论

文章目录

    查看评论