04-Linux文本处理-sed
Posted 广州富哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-Linux文本处理-sed相关的知识,希望对你有一定的参考价值。
- sed软件从文件或管道中循环的读取一行,处理一行,输出一行。
- 模式空间,sed软件内部是一个临时缓存,用于存放读取到的内容。
软件版本
sed --version
GNU sed version 4.2.1
语法格式
sed [option] [sed commands] [file]
sed [选项] [sed命令] [输入文件]
sed选项
选 项 | 功 能 |
---|---|
-n | 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行 |
-e | 多重编辑,且命令顺序会影响结果 |
-f | 指定一个 sed 脚本文件到命令行执行 |
-r | Sed 使用扩展正则 |
-i | 直接修改文档读取的内容,不在屏幕上输出 |
sed 命令
命 令 | 说 明 |
---|---|
a | 在当前行后添加一行或多行 |
c | 用新文本修改(替换)当前行中的文本 |
d | 删除行 |
i | 在当前行之前插入文本 |
h | 把模式空间里的内容复制到暂存缓存区 |
H | 把模式空间里的内容追加到暂存缓存区 |
g | 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容 |
G | 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始处理 |
q | 结束或退出 sed |
r | 从文件中读取输入行 |
! | 对所选行意外的所有行应用命令 |
s | 用一个字符串替换另一个 |
g | 在行内进行全局替换 |
p | 打印行 |
w | 将行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符转换为另一字符(不能对正则表达式使用 y 命令) |
sed地址范围显示
- sed软件可以对单行或多行进行处理。
- 如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
- 用法:n1[,n2]{sed-commands}
- 地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。
例子 | 功能 |
---|---|
10i | 对第10行操作 |
10,20i | 对10到20行操作,包括第10,20行 |
10,+20i | 对10到30(10+20)行操作,包括第10,30行 |
1~2i | 对1,3,5,7,……行操作 |
10,$i | 对10到最后一行($代表最后一行)操作,包括第10行 |
/oldboy/i | 对匹配oldboy的行操作 |
/oldboy/,/Alex/i | 对匹配oldboy的行到匹配Alex的行操作 |
/oldboy/,$i | 对匹配oldboy的行到最后一行操作 |
/oldboy/,10i | 对匹配oldboy的行到第10行操作如果前10行没有匹配到oldboy,而10行以后匹配oldboy的,则会显示出来。 |
1,/Alex/i | 对第1行到匹配Alex的行操作 |
/oldboy/,+2i | 对匹配oldboy的行到其后的2行操作 |
增删改查
增
- a --追加文本到指定行后
- i --插入文本到指定行前
在第二行后面添加内容
sed ‘2a 106,dandan,CSO‘ person.txt
在第二行插入内容
sed ‘2i 106,dandan,CSO‘ person.txt
在第二行后面添加两行内容
sed ‘2a 106,dandan,CSO
107,bingbing,CCO‘ person.txt
删
- d --删除指定的行
删除所有行
sed ‘d‘ person.txt
删除第二行
sed ‘2d‘ person.txt
删除第二到五行
sed ‘2,5d‘ person.txt
删除从第三行开始到最后
sed ‘3,$d‘ person.txt
删除有关键字zhangyao的行
sed ‘/zhangyao/d‘ person.txt
删除有oldboy的行到包含Alex的行(范围)
sed ‘/oldboy/,/Alex/d‘ person.txt
改
- c --用新行取代旧行
将第二行替换成其他内容
sed ‘2c 106,dandan,CSO‘ person.txt
- s --用一个字符串替换另一个
- g --在行内进行全局替换
- -i --修改文件内容
sed -i ‘s/内容1/内容2/g‘ oldboy.log
sed -i ‘s#内容1#内容2#g‘ oldboy.log
定界符/或#,也可以是任意符号如:或|等,但当替换内容包含定界符时,需转义。
默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。
定界符第一个和第二个之间的就是被替换的内容(可以使正则表达式),第二个和第三个之间的就是替换后的内容(必须是具体内容)。
指定行修改内容
sed ‘3s#0#9#‘ person.txt
指定变量的内容去替换
sed "s#$x#$y#g" test.txt
eval sed ‘s#$x#$y#g‘ test.txt
用sed命令重命名当前目录下包含_finished的jpg文件
ls *.jpg |sed -r ‘s#(^.*)_finished.*#mv & 1.jpg#g‘ |bash
ls *.jpg --列出所有的jpg文件
sed -r --使用正则表达式匹配
(^.*) --匹配任意字符串开头
_finished.* --匹配包含_finished.,并任意字符串结尾
mv & -- &是显示前面匹配到的结果
1 -- 显示前面括号内匹配到的内容
|bash -- 以命令的形式执行替换后内容
修改前
stu_102999_1_finished.jpg
以命令的形式执行替换后内容
mv stu_102999_1_finished.jpg stu_102999_1.jpg
查
- p --输出指定内容
- 但默认会输出2次匹配的结果
- 使用n取消默认输出
显示第二行内容
sed -n ‘2p‘ person.txt
显示第二到第三行
sed -n ‘2,3p‘ person.txt
显示所有行
sed -n ‘p‘ person.txt
显示包含CTO的行
sed -n ‘/CTO/p‘ person.txt
显示包含CTO的行到包含CFO的行(范围)
sed -n ‘/CTO/,/CFO/p‘ person.txt
显示从第二行到包含CFO的行(范围)
sed -n ‘2,/CFO/p‘ person.txt
以上是关于04-Linux文本处理-sed的主要内容,如果未能解决你的问题,请参考以下文章