原文地址: https://www.jianshu.com/p/89163e927a2c
0. 目录
1.简介
2.子命令
2.1 p--输出
2.2 i--插入行
2.3 a --追加行
2.4 d删除行
2.5 c替换行
2.6 s替换指定文本
- 子命令组合
1. 简介
在命令行对文本进行操作, 如替换某文字, 插入文字, 删除文字等
语法格式
sed [options] commands [inputfile...]
commands
会包含一些子命令,如p
代表打印i
和a
代表插入和追加,d
代表删除行c
代表替换行s
代表替换单词
option
包含的一些选项及其作用如下
选项名 | 作用 |
---|---|
-n | 取消默认输出 |
-e | 多点编辑,可以执行多个子命令 |
-f | 从脚本文件中读取命令(sed操作可以事先写入脚本,然后通过-f读取并执行) |
-i | 直接编辑原文件 |
-l | 指定行的长度 |
-r | 在脚本中使用扩展表达式 |
测试文本
root@wzj-dev:/opt# cat test1.txt
letitia
mail
uuencode
1003605091
01566
sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。
以下实验均为缓冲区操作,未改变源文件
2. 子命令
2.1 p
--输出
2.1.1 打印1-3行
root@wzj-dev:/opt# sed '1,3 p' test1.txt
letitia
letitia
mail
mail
uuencode
uuencode
1003605091
01566
因为未加-n
选项,所以除了打印第1-3行外, 还有个默认打印, 导致第1-3行打印两遍
root@wzj-dev:/opt# sed -n '1,3 p' test1.txt
letitia
mail
uuencode
2.1.2 正则 --打印ma
开头的那一行到最后一行
root@wzj-dev:/opt# sed -n '/^ma/,$ p' test1.txt
mail
uuencode
1003605091
01566
2.1.3 设置步长--- 第一行开始,行号递增2输出
root@wzj-dev:/opt# sed -n '1~2 p' test1.txt
letitia
uuencode
01566
2.2 i
--插入行
在第二行前插入一行insert111
字符串
#-e选项表示多个子命令,本例执行i子命令之后执行了p子命令
root@wzj-dev:/opt# sed -n -e '2 i insert111' -e '1,4 p' test1.txt
letitia
insert111
mail
uuencode
1003605091
2.3 a
--追加行
在第二行之后追加一行append111
字符串
root@wzj-dev:/opt# sed -n -e '2 a append111' -e '1,4 p' test1.txt
letitia
mail
append111
uuencode
1003605091
2.4 d
删除行
删除第二行
root@wzj-dev:/opt# sed -n -e '2 d' -e '1,$ p' test1.txt
letitia
uuencode
1003605091
01566
2.5 c
替换行
将第二行的mail
替换为newmail
root@wzj-dev:/opt# sed -n -e '2 c newmail' -e '1,$ p' test1.txt
letitia
newmail
uuencode
1003605091
01566
2.6 s
替换指定文本
2.6.1 语法格式
sed '位置参数 s/pattern/replaced/[flag]'
位置参数: 与前面一样, 可以为'1,$',支持正则,也可以不指定
s: 子命令,代表替换指定文本
pattern: 要替换的文本,支持正则表达式
replaced: 用来替换的一般字符串
flag是替换标志,用来影响匹配替换的规则:
flag | 用法 |
---|---|
g | 全局匹配,会替换文本行中所有匹配的字符串 |
十进制n | 替换文本行中第n个匹配的字符串 |
p | 替换第一个匹配的字符串,并且将缓冲区输出到标准输出 |
w | 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中 |
缺省 | 替换第一个匹配的字符串 |
2.6.2 实验
- 将有十个数字的那一行替换为
miss letitia
#{}要转义
root@wzj-dev:/opt# sed -n -e 's/[0-9]\{10\}/miss letitia/g' -e '1,$ p' test1.txt
letitia
mail
uuencode
miss letitia
01566
- 从第一行开始,到以字符
ma
开头的那一行, 里面的l
全转为大写L
sed -n -e '1,/^ma/ s/l/L/g' -e '1,$ p' test1.txt
Letitia
maiL
uuencode
1003605091
01566
3. 子命令组合
对第1-3行做如下操作
-
l
全转为大写L
-
e
全转为大写E
- 在第二行前插入一行
tyrone
字符串 - 打印出来 ( 原来的三行加上插入的一行 )
root@wzj-dev:/opt# sed -n '1,3{
s/l/L/g
s/e/E/g
2 i tyrone
p
}' test1.txt
LEtitia
tyrone
maiL
uuEncodE
网友评论