Sed操作命令
sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址,sed 就会处理输入的所有的行
命令集合
x:指定行号。
x,y:指定从x到y的行号范围
/ pattern/:查询包含模式的行 # # % %
/ pattern/ pattern/:查询包含两个模式的行
/ pattern/,x:从与 pattern的匹配行到x号行之间的行
x,/ pattern/:从x号行到与 pattern的匹配行之间的行
x,y!:查询不包括x和y行号的行
r:从另一个文件中读文件
w:将文本写入到一个文件
y:变换字符
q:第一个模式匹配完成后退出
l:显示与八进制ASCⅡ码等价的控制字符
{}:在定位行执行的命令组
p:打印匹配行
=:打印文件行号。
a:在定位行号之后追加文本信息
i:在定位行号之前插入文本信息。
d:删除定位行
c:用新文本替换定位文本
s:使用替换模式替换相应模式
n:读取下一个输入行,用下一个命令处理新的行
N:将当前读入行的下一行读取到当前的模式空间。
h:将模式缓冲区的文本复制到保持缓冲区
H:将模式缓冲区的文本追加到保持缓冲区
x:互换模式缓冲区和保持缓冲区的内容
g:将保持缓冲区的内容复制到模式缓冲区
G:将保持缓冲区的内容追加到模式缓冲区。
删除
- 将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示
nl /etc/passwd | sed '2,5d’
注: sed是sed -e的简写, 后接单引号
2.同上删除第2行
nl /etc/passwd | sed '2d’
3.同上删除第三行到最后一行nl /etc/passwd | sed '3,KaTeX parse error: Expected group after '^' at position 21: … 4.删除批注行 sed '/^̲#.*/d' /etc/ini…/d’
插入
4.在第二行后加上一行test nl /etc/passwd | sed ‘2a test’
5. 在第二行前加上一行test nl /etc/passwd | sed ‘2i test’
6. 在第二行后加入三行test nl /etc/passwd|sed ‘2a ttttttt\ndddd\nhhh’
替换
6. 将2-5行内容取代为 No 2-5 number nl /etc/passwd | sed ‘2,5c No 2-5 number’
7. 把9.txt 文件中 old 替换为new
Sed ‘s/old/new/g’ 9.txt # s///g 内容替换g全局替换
8. 在一行的内容前边添加内容
sed ‘/good/ s/^/&word/g’ 9.txt #<== /good/会匹配特定的内 容,然后对匹配到的行进行s/KaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲word/g 替换操作 ,&的…/&word/g’ 9.txt #<== /good/会匹配特定的内 容,然后对匹配到的行进行s/$/&word/g 替换操作 ,&的意思追加
打印
8. 列出/etc/passwd 内第5-7行 nl /etc/passwd |sed -n ‘5,7p’
查询
9.获取本机IP的行 /sbin/ifconfig eth0 |grep ‘inet addr’
10.将IP前面的部分予以删除 /sbin/ifconfig eth0 |grep ‘inet addr’| sed ‘s/^.addr://g’
11.将IP后面的部分删除
/sbin/ifconfig eth0 |grep ‘inet addr’| sed ‘s/^.addr://g’| sed 's/Bcast:.$//g’
/sbin/ifconfig eth0| sed -n '/^\sinet addr/p’|sed ‘s/^\sinet addr://g’|sed 's/Bcast:.//g’
12.用grep将关键词MAN所在行取出来 cat /etc/man.config |grep ‘MAN’
例题:
(1)替换 1.txt文本中old为new,代码如下
sed 's/old/new/g ’ 1. txt
(2)打印 1. txt文本第一行至第三行,代码如下
Sed -n ‘1,3p’ 1.txt
(3)打印 1.txt文本中第一行与最后一行,代码如下
Sed -n ‘1p; $p’ 1.txt
(4)删除 1.txt第一行至第三行、删除匹配行至最后一行,代码如下
Sed ‘1,3d’ 1.txt
Sed ‘/aaaa/,
d
’
1.
t
x
t
(
5
)
删
除
1.
t
x
t
最
后
3
行
及
删
除
最
后
一
行
,
代
码
如
下
:
S
e
d
‘
d’ 1.txt (5)删除 1. txt最后3行及删除最后一行,代码如下: Sed ‘
d’1.txt(5)删除1.txt最后3行及删除最后一行,代码如下:Sed‘d’ 1.txt
(6)删除 1.txt最后6行,代码如下:
Sed ‘
d
’
1.
t
x
t
(
7
)
在
1.
t
x
t
查
找
a
a
a
所
在
行
,
并
在
其
下
一
行
添
加
w
o
r
d
字
符
,
a
表
示
在
其
下
一
行
添
加
字
符
串
,
代
码
如
下
:
S
e
d
‘
/
a
a
a
/
a
w
o
r
d
’
1.
t
x
t
(
8
)
在
1.
t
x
t
查
找
b
b
b
所
在
行
,
并
在
其
上
一
行
添
加
w
o
r
d
字
符
,
i
表
示
在
其
上
一
行
添
加
字
符
串
,
代
码
如
下
;
S
e
d
‘
/
b
b
b
/
i
w
o
r
d
’
1.
t
x
t
8
、
在
1.
t
x
t
查
找
以
.
t
e
s
t
结
尾
的
行
,
在
其
行
尾
添
加
字
符
串
w
o
r
d
,
d’ 1.txt (7)在 1.txt查找aaa 所在行,并在其下一行添加word字符,a表示在其下一行添加字符串,代码如下: Sed ‘/aaa/a word’ 1.txt (8) 在 1.txt查找bbb 所在行,并在其上一行添加word字符,i表示在其上一行添加字符串,代码如下; Sed ‘/bbb/i word’ 1.txt 8、在 1.txt查找以.test结尾的行,在其行尾添加字符串word,
d’1.txt(7)在1.txt查找aaa所在行,并在其下一行添加word字符,a表示在其下一行添加字符串,代码如下:Sed‘/aaa/aword’1.txt(8)在1.txt查找bbb所在行,并在其上一行添加word字符,i表示在其上一行添加字符串,代码如下;Sed‘/bbb/iword’1.txt8、在1.txt查找以.test结尾的行,在其行尾添加字符串word,表示结尾标识,&在sed中表示追加,代码如下
sed ‘/test
/
s
/
/ s/
/s//&word/g’ 1.txt
10、在1.txt查找www的行,在其行首添加字符串word,^表示起始标识,&在sed中表示添加,代码如下
sed ‘/www/ s/^/&word/g’ 1.txt
11、多个sed命令组合,使用e参数,代码如下
sed -e ‘/www.jd.com/ s/^/&1./g’ -e ‘s/www.jd.comKaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲./g' 1.txt (12)…/6./g’ 1.txt
(13) 修改 SELinux策略 enforcing为 disabled,查找/ SELINUX/行,然后将其行
(14) 删除偶数行 sed ‘n;d’ name.txt
(15) 删除奇数行sed ‘1d;n;d’ name.txt
(16)enforccing值改成 disabled,!s表示不包括 SELINUX行,代码如下:
sed -i ‘/SELINUX/ s/enforcing/disabled/g’ /etc/selinux/config
sed -i ‘/SELINUX/! s/enforcing/disabled/g’ /etc/selinux/config
通常而言,sed将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执
行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入
直到文件处理完备
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以
便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行,这时可
以使用sed高级语法来满足用户需求。总的来说,sed高级命令可以分为以下3种功能
N、D、P:处理多行模式空间的问题
H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑
:、a:b、t在脚本中实现分支与条件结构
(1)在1.txt每行后加入空行,也即每行占用两行空间,每一行后边插入一行空行两行空行及前三行每行后插入空行,代码如下
sed ‘/^ $/d; G’ 1.txt
sed ‘/^ $/d; G; G’ 1.txt
sed ‘/^ KaTeX parse error: Expected group after '^' at position 268: …行,代码如下: sed '/^̲/d; G’ 1.txt
(5)在jedu.txt每行后加入两行空行,也即每行占用三行空间,每一行后边插入空行代码如下
sed ‘/^ $/d; G;’ 1.txt
(6)在 jiedu.txt每行前加入顺序数字序号、加上制表符“\t”"及“,”符号,代码如下
sed = 1.txt| sed ‘N; s/\n/ /’
sed = 1.txt| sed ‘N; s/\n/\n/\t’
sed = 1.txt| sed ‘N; s/\n/\ ./’
(7)删除 ifed.txt行前和行尾的任意空格,代码如下
sed ‘s/1* //; s/[ \t] *
/
/
′
1.
t
x
t
(
8
)
打
印
f
e
d
u
.
t
x
t
关
键
词
o
l
d
与
m
e
w
之
间
的
内
容
,
代
码
如
下
:
s
e
d
−
n
′
o
l
d
/
,
/
n
e
w
/
′
p
1.
t
x
t
(
9
)
打
印
及
删
除
i
f
e
d
.
:
最
后
两
行
,
代
码
如
下
s
e
d
′
//' 1.txt (8)打印 fedu. txt关键词old与mew之间的内容,代码如下: sed -n 'old/,/new/'p 1.txt (9)打印及删除 ifed.:最后两行,代码如下 sed '
//′1.txt(8)打印fedu.txt关键词old与mew之间的内容,代码如下:sed−n′old/,/new/′p1.txt(9)打印及删除ifed.:最后两行,代码如下sed′!N; $!D’ 1.txt
sed ‘N; $!p; $!D;
d
′
1.
t
x
t
(
10
)
合
并
上
,
下
两
行
,
也
即
两
行
合
并
,
代
码
如
下
s
e
d
′
d' 1.txt (10)合并上,下两行,也即两行合并,代码如下 sed '
d′1.txt(10)合并上,下两行,也即两行合并,代码如下sed′!N; s/\n/ /’ 1.txt
sed ‘N; s/\n/ /’ 1.txt
\t ↩︎