SHELL编程三剑客之sed详解

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

你可能感兴趣的:(Linux运维,linux)