SHELL编程三剑客之sed详解
sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与VIM编辑器类似,它一次处理一行内容,Sed可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),紧接着用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。
逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。其语法参数格式为:
sed的选项、命令、替换标记
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
sed工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加-i参数即对文件彻底修改;
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由屏幕输出
x #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 #显示与八进制ASCII码等价的控制字符;
{} #在定位行执行的命令组;
p #打印匹配行;
= #打印文件行号;
a\ #在定位行号之后追加文本信息;
i\ #在定位行号之前插入文本信息;
d #删除定位行;
c\ #用新文本替换定位文本;
s #使用替换模式替换相应模式;
n #读取下一个输入行,用下一个命令处理新的行;
N #将当前读入行的下一行读取到当前的模式空间。
常用命令:
a ∶新增, a 的后面可以接字符串,而这些字符串会在目前的下一行出现。
c ∶取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行。
d ∶删除,后面不接任何东西;
i ∶插入, 与a只有一点不同,增加的字符串会在目前的上一行出现;
p ∶列印,亦即将某个选择的资料印出。在使用p的时候一般会加上-n参数。
s ∶取代,可以直接进行取代的工作。
基本用法
d∶删除,后面不接任何东西;
删除某行
$ sed '1d' filename #删除第一行
$ sed '$ d' filename #删除最后一行
$ sed '1,2d' filename #删除第一行到第二行
$ sed '2,$ d' filename #删除第二行到最后一行
p∶列印,亦即将某个选择的资料印出。在使用p的时候一般会加上-n参数。
显示某行
$ sed -n '1p' filename #显示第一行
$ sed -n '$ p' filename #显示最后一行
$ sed -n '1,2p' filename #显示第一行到第二行
$ sed -n '2,$ p' filename #显示第二行到最后一行
使用模式进行查询
$ sed -n '/lqcbj/p' filename #查询包括关键字lqcbj所在所有行
$ sed -n '/\$ /p' filename #查询包括关键字$ 所在所有行,使用反斜线\屏蔽特殊含义
a∶新增, a 的后面可以接字符串,而这些字符串会在目前的下一行出现。
i ∶插入, 与a只有一点不同,增加的字符串会在目前的上一行出现;
[root@localhost ~]# cat filename
Hello!
lqcbj!
end
[root@localhost ~]# sed '1a people' filename #第一行后增加字符串"people"
Hello!
people
lqcbj!
end
[root@localhost ~]# sed '1,3a people' filename #第一行到第三行后增加字符串"people"
Hello!
people
lqcbj!
people
end
people
[root@localhost ~]# sed '1i people\nperson' filename #第一行前增加多行,使用换行符\n
people
person
Hello!
lqcbj!
end
c∶取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行。
[root@localhost ~]# cat filename
Hello!
lqcbj!
end
[root@localhost ~]# sed '1c Hi' filename
Hi
lqcbj!
end
[root@localhost ~]# sed '1,2c Hi' filename
Hi
end
s ∶取代,可以直接进行取代的工作。
格式:sed 's/要替换的字符串/新的字符串/g' 修改的文件
[root@localhost ~]# cat filename
Hello!
lqcbj!
end
[root@localhost ~]# sed -i 's/Hello!/start/g' filename #把Hello!替换为start
[root@localhost ~]# cat filename
start
lqcbj!
end
[root@localhost ~]# cat filename
start
lqcbj!
end
[root@localhost ~]# sed -i '$a bye' filename #在最后一行后面新加bye($代表最后一样,a表示在当前行下一面添加,bye是新加内容,中间有没有空格都行)
[root@localhost ~]# cat filename
start
lqcbj!
end
bye
常用SED工具使用方法:
1、替换lqcbj.txt文本中old为new:
sed 's/old/new/g' lqcbj.txt
2、打印lqcbj.txt文本第一行至第三行:
sed -n '1,3p' lqcbj.txt
3、打印lqcbj.txt文本中第一行与最后一行:
sed -n '1p;$p' lqcbj.txt
4、删除lqcbj.txt第一行至第三行、删除匹配行至最后一行:
sed '1,3d' lqcbj.txt
sed '/lqcbj/,$d' lqcbj.txt
5、删除lqcbj.txt最后6行及删除最后一行:
for i in `seq 1 6`;do sed -i '$d' lqcbj.txt ;done
sed '$d' lqcbj.txt
6、删除lqcbj.txt最后1行:
sed '$d' lqcbj.txt
7、在lqcbj.txt查找lqcbj所在行,并在其下一行添加word字符,a表示在其下一行添加字符串:
sed '/lqcbj/aword' lqcbj.txt
8、在lqcbj.txt查找lqcbj所在行,并在其上一行添加word字符,i表示在其上一行添加字符串:
sed '/lqcbj/iword' lqcbj.txt
9、在lqcbj.txt查找以test结尾的行尾添加字符串word,$表示结尾标识,&在Sed中表示添加:
sed 's/test$/&word/g' lqcbj.txt
10、在lqcbj.txt查找www的行,在其行首添加字符串word,^表示起始标识,&在Sed中表示添加:
sed '/www/s/^/&word/' lqcbj.txt
11、多个sed命令组合,使用-e参数:
sed -e '/www.360.com/s/^/&1./' -e 's/www.360.com$/&./g' lqcbj.txt
12、多个sed命令组合,使用分号“;”分割:
sed -e '/www.360.com/s/^/&1./;s/www.360.com$/&./g' lqcbj.txt
13、sed读取系统变量,变量替换:
WEBSITE=WWW.lqcbj.NET
sed“s/www.360.com/$WEBSITE/g” lqcbj.txt
14、修改Selinux策略enforcing为disabled,查找/SELINUX/行,然后将其行enforcing值改成disabled、!s表示不包括SELINUX行:
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
15、合并上下两行,也即两行合并:
sed 'N;s/\n/ /' lqcbj.txt