sed 笔记

sed 笔记
介绍
sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

sed '范围(模式)命令' file

选项:
-n:静默模式,不输出模式空间内的内容;默认打印空间模式的内容
-r:扩展的正则表达式
-f 文件:指定sed脚本文件
-e 'script' -e 'script' :指定多个编辑指令
-i : 直接编辑原文件
编辑命令:
d:删除
p: 打印
i :在被指定到的行前面插入文本
a :在被指定的行的下面插入文本
:换行
r 文件:在指定位置把另外一个文件的内容插入
w 文件:将符合条件的所有行保存至指定文件中
=:显示符号条件的行的行号
s///:查找条件可以使用模式,但是要替换的内容不行

地址定界:自定义的起始行到结束行
startline,endline
1,3
/pat1/,/pat2/
/pattern/

用法:sed [options] 'addr1[,addr2]编辑命令' FILE...
sed [options] "addr1[,addr2]编辑命令" FILE...

正则表达式:
基本的
字符:
.
[]
[^]
次数
*
?
{m,n}
锚定:
^
$
<,
>,
分组:
()
引用:
1,2,……
扩展:
字符:
.
[]
[^]
次数
*
?
{m,n}
+
锚定:
^
$
<,
>,
或:
a|b
分组:
()
引用:
1,2,……
sed '地址定界s@查找条件@替换文件@'
修饰符:
g:global,全局替换
i:ignore-case,不区分字符大小写

举几个栗子:
跨步删除:
sed '1 ~ 2 d' passwd

cat a
to
tom aaa bbbtomaaa
111 tom aaaTOm cccc
aaaatomaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaatom
aaaa tom123 bbbbbb cccc
vvvv tom123457894 dddd
tooooooooooom fffff
tttttom rrrr
gggg tom1 y
jjjj kkkk lllll
ggggggggggggggggg
0000000000000000
栗子开始:
删除tom所在的行
sed -n '/tom/d;p' a

删除tom开头tom结尾的行
sed -n '/^tom/,/tom$/d;p' a
to

[root@iZ94h902cjhZ tmp]# sed -n '/<to/d;p' a 删除单词有to开头的行
aaaatomaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaatom
[root@iZ94h902cjhZ tmp]# sed -n '/om>/d;p' a 删除是om结尾的行
to
aaaatomaaaaaaaaa
[root@iZ94h902cjhZ tmp]# sed -n '/<tom>/d;p' a 删除有tom这个单词的行
to
aaaatomaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaatom

sed '/tom/,$d' a 从tom 到最后一行之间的内容删除
to

sed替换
sed 's/old/new/标签' file

sed 's/tom/TOM/2' a 替换第二个tom 标签是几就操作第几个字符
to
tom aaa bbbTOMaaa
111 tom aaaTOm cccc

find /usr/local -maxdepth 2 -type d | sed -n 's//usr/local/man//usr/share/man/p' 替换路径
/usr/share/man
/usr/share/man/man3

find /usr/local -maxdepth 2 -type d | sed -n 's!/usr/local/man!/usr/share/man!p'
/usr/share/man
/usr/share/man/man3

b=/usr/share/man 引用shell里面的变量 需要在sed里面加上单引号
find /usr/local -maxdepth 2 -type d | sed -n 's!/usr/local/man!'$b'!p'
/usr/share/man
/usr/share/man/man3

[root@iZ94h902cjhZ tmp]# sed '3,7{s/tom/TOM/;s/[0-9]/wwww/g}' a 首先指定范围3-7行然后在大括号里执行多条命令
to
tom aaa bbbtomaaa
wwwwwwwwwwww TOM aaaTOm cccc
aaaaTOMaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaTOM
aaaa TOMwwwwwwwwwwww bbbbbb cccc
vvvv TOMwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww dddd
tooooooooooom fffff
tttttom rrrr
gggg tom1 y
jjjj kkkk lllll
ggggggggggggggggg
00000000000000000

old/new/标签 file
old位置可以用正则,new的位置不能用正则但是可以使用:
sed -n '3 s/tom/&/p' a
111 tom aaaTOm cccc &表示old的值

sed -n '3 s/tom/tUaaaaaaaaaaa/gp' a
111 tAAAAAAAAAAA aaaTOm cccc U 把U后面的值全部换成大写

sed -n '3 s/tom/tuaaaaaaaaaaa/gp' a
111 tAaaaaaaaaaa aaaTOm cccc u 后面第一个换成大写

sed -n '3 s/tom/tLAAAAAAAAAAA/gp' a
111 taaaaaaaaaaa aaaTOm cccc L 把后面大写的全部换成小写

sed -n '3 s/tom/tlAAAAAAAAAAA/gp' a
111 taAAAAAAAAAA aaaTOm cccc l只替换第一个
E 中止操作

sed -n 's/(ro)(ot)/2/p' passwd group分组 #这里引用第二部分就是ot
ot,x:0:0:root:/root:/bin/bash

sed -n 's/(ro)(ot)/12/p' passwd
root,x:0:0:root:/root:/bin/bash 引用第一和第二部分

sed -n '$ a zhe shi xin tian jia de yi hang' a
zhe shi xin tian jia de yi hang a在指定的行下面添加一行
i 在指定行的上一行添加
sed -n '/root/ c a' passwd
a c替换整行

sed -n '/root/r /etc/hosts' passwd r将文件读取到匹配行的后面
127.0.0.1 iZ94h902cjhZ localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.116.93.93 iZ94h902cjhZ
#120.131.68.199 app.hexindai.com
120.131.68.200 app.hexindai.com
47.88.21.177 www.iteemo.org

原文地址:https://www.cnblogs.com/iteemo/p/4892331.html