sed是什么
sed 是 stream editor 的缩写,中文称之为“流编辑器”。
sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。
sed原理
sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。
sed命令选项
选项 | 说明 |
---|---|
-e | 表示用指定命令或脚本来处理输入的文本文件 |
-f | 表示用指定的脚本文件来处理输入的文本文件 |
-h | 或—help 显示帮助 |
-n | 表示显示处理后的结果 |
-i | 直接编辑文本文件 |
-i.bak | 备份文本文件 |
-r,-E | 使用扩展正则表达式 |
-s | 将多个文件视为独立文件,而不是单个连续的长文件流 |
sed针对文件操作的命令
命令 | 说明 |
---|---|
a | 增加,在当前行下面增加一行指定内容 |
c | 替换,将选定行替换为指定内容 |
d | 删除,删除选定的行 |
i | 插入,在选定行上面插入一行指定内容 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容 |
s | 替换,替换指定字符 |
y | 字符转换 |
迁移符合条件的文本
在使用 sed 命令迁移符合条件的文本时,常用到以下参数
H | 复制到剪贴板 |
---|---|
g G | 将剪贴板中的数据覆盖/追加至指定行 |
w | 保存为文件 |
r | 读取指定文件 |
a | 追加指定内容 |
l i | 忽略大小写 |
sed用法
在此之前,先看看原文件的内容
#我们先来看看原文件的内容
[roc@roclinux ~]$ cat 1.txt
test 1
test2
test3
test4
test5
1、模糊匹配
/the/ 包含 显示包含the的行
sed -n '/the/p' test.log
打印第4行开始有the的行
sed -n '4,/the/p' test.log
打印出现the所在行号
sed -n '/the/=' test.log
显示the开头的行
sed -n '/^the/p' test.log
显示数字0-9结尾的行
sed -n '/[0-9]$/p' test.log
模糊匹配删除
删除文件中带字符“2”的行
sed '/2/d' roc.txt
删除后的文件内容
[roc@roclinux ~]$ cat 1.txt
test 1
test3
test4
test5
2、提取某一列数据
先来一起看看/etc/passwd文件的内容
[root@master home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
#我们这回用sed命令来提取文件中每行的第一个域, 间隔符是冒号
[root@master home]# head -n 5 /etc/passwd|sed 's/:.*$//'
root
bin
daemon
adm
lp
3、筛选行
显示 test.log 文件的第 10 行到第 20 行的内容
sed -n '10,20p' test.log
显示第4行的内容
sed -n '4p' test.log
cat test.log | sed -n 4p
输出文件所有内容
显示所有奇数行
sed -n 'p;n' 1.txt
显示所有偶数行
sed -n 'n;p' 1.txt
4、替换
将所有以 d 或 D 开头的行里的所有小写 x 字符变为大写 X 字符
sed '/^[dD]/s/x/X/g' test
5、删除每行的最后两个字符
# 点号表示一个单个字符, 两个点号就表示两个单个字符
sed 's/..$//' test
6、删除每一行的前两个字符
sed 's/..//' test
7、展示匹配行之间的内容
展示匹配了2005的行和2007的行之间的内容
#文件内容展示一下
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
#我们想展示匹配了2005的行和2007的行之间的内容
[roc@roclinux ~]$ sed -n ‘/2005/,/2007/p’ mysed.txt
Beijing 2005
Beijing 2006
Beijing 2007
8、-e
选项设置多个command
有一个地方值得大家注意,那就是-e
选项的后面要立即接 command 内容,不允许再夹杂其他选项。
#文件内容展示一下
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
#我们通过2个-e选项设置了两个command,展示第1、2、4行的内容
[roc@roclinux ~]$ sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2006
9、插入内容
9.1、插入另一个文件的所有内容 r\
#将要插入的内容保存到一个单独的文件中
[roc@roclinux ~]$ cat ins.txt
====China====
#展示一下要处理的文件
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
#使用r来实现插入 ,将ins.txt的内容插入到 mysed.txt的2005所在行的下面
[roc@roclinux ~]$ sed ‘/2005/r ins.txt’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
====China====
Beijing 2006
Beijing 2007
Beijing 2008
9.2、在下一行插入指定内容 a\
#在2004的下一行插入China
[roc@roclinux ~]$ sed ‘/2004/a\China’ mysed.txt
Beijing 2003
Beijing 2004
China
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
9.3、在上一行插入内容 i\
[roc@roclinux ~]$ sed ‘/2004/i\China’ mysed.txt
Beijing 2003
China
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
10、替换 y/
#原文件内容
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
# y 就是按照字符顺序, 实现前后的替换,看上去是将所有的 "ei" 替换为 "ie",其实是将e换成i,将i换成e
[roc@roclinux 20160229]$ sed 'y/ei/ie/' mysed.txt
Biejeng 2003
Biejeng 2004
Biejeng 2005
Biejeng 2006
Biejeng 2007
Biejeng 2008
在举例,如果换成y/ee/ei/
会产生什么效果呢?
[roc@roclinux 20160229]$ sed 'y/ee/ie/' mysed.txt
Biijing 2003
Biijing 2004
Biijing 2005
Biijing 2006
Biijing 2007
Biijing 2008
# 原理,表面上看好像是将ee换成ie,其实替换的时候是单个替换的,
# 也就是将ee中的第一个e换成ie中的第一个i,
# 将ee第二个e换成ie中的第二个e,替换原理如下
e e
↓ ↓
换 换
成 成
↓ ↓
i e
11、将指定行写入到特定文件中
#将包含2004、2005、2006的行保存到new.txt文件中
[roc@roclinux ~]$ sed ‘/200[4-6]/w new.txt’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
#我们要的内容已经乖乖到碗里来了
[roc@roclinux ~]$ cat new.txt
Beijing 2004
Beijing 2005
Beijing 2006
12、修改文件内容 -i
想要直接修改文件内容,只需要加个-i
参数即可,例如
#删除文件中带字符“2”的行
sed -i '/2/d' roc.txt
13、追加内容 a
在第3行下追加指定内容,,其中yexindong
是新加的内容,3
表示第三行,a
表示追加
sed '3ayexindong' roc.txt