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' #删除所有的空格
评论
评论列表
暂无评论