shell编程之sed

Posted wsw-seu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之sed相关的知识,希望对你有一定的参考价值。

sed是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定的文件名,然后在屏幕上查看输出。流式编辑器sed逐行读取文件内容存储在临时缓冲区,称为“模式空间”,

接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。原文件内容并没有改变。

一、简单用法示例

sed [options] cmds  files

选项:-e  连接多个编辑命令

   -f  指定sed脚本文件名

      -n 阻止输入行自动输出(无输出)

例如:

sed  ‘4,$d‘  test.in :  d表示删除,命令表示从第四行开始删除,到最后一行。即前三行输出。原文件内容不变。分号中的内容就是cmd命令

sed  ‘3q‘  test.in:  q表示退出。处理到第三行时退出,即输出前三行

sed  ‘s/public/PUBLIC/‘  test.in:  表示将public替换成PUBLIC。如果某行有多个public,只替换那行的第一个。

sed  ‘s/public/PUBLIC/g‘  test.in:  将一行中多个public都替换掉。其他行原样输出

sed  -n  ‘s/public/PUBLIC/p‘  test.in:   -n使所有行都屏蔽,即没有输出。但又希望public行输出,可利用p命令打印public行

 

二、指定多个命令的方法:

1、用分号隔开:

sed  ‘s/public/PUBLIC/;s/north/NORTH/‘  test.in

2、每个命令前放-e选项

sed  -e  ‘s/public/PUBLIC/‘   -e  ‘s/north/NORTH/‘  test.in

3、使用分行命令功能,在输入单引号后按return键就会出现多行提示符(>)

sed  ‘

> s/public/PUBLIC/

> s/north/NORTH/‘  test.in

 

三、sed命令的语法

sed_cmd: 使用格式

[address] sed_edit_cmd  (通常用单引号括起来),其中adress为sed的行定位模式,用来指定将要被sed编辑的行。如果省略,sed将编辑所有的行。sed_edit_cmd为sed对被编辑行将要进行的编辑操作。

1、address地址定位方式

n表示第n行

$表示最后一行  : sed -n ‘$p‘  test.in   输出最后一行

m,n:表示第m行到第n行

/pattern/:查询包含指定模式的行。如/disk/、/[a-z]/

/pattern/,n:表示从包含指定模式的行到第n行

n,/pattern/:表示从第n行到包含指定模式的行

/pattern1/,/pattern2/:表示从包含模式1的行到包含模式2的行

!:反向选择,如m,n!的结构与m,n相反。

 

2、常用的sed_edit_cmd

p: 打印匹配行

sed  -n  ‘3,5p‘  test.in   打印第3到5行    -n阻止其他行的自动输出

sed  -n  ‘$p‘  test.in  打印最后一行

sed  -n  ‘/north/p‘  test.in  打印包含north行

 

=:显示匹配行的行号

sed  -n  ‘/north/=‘  test.in   输出所有包含north的行号

 

d: 删除匹配的行

sed  ‘/north/d‘  test.in

 

s:替换命令,使用格式为:

[address] s/old/new/[gpw]

g:全局替换

p:打印被修改后的行

w fname:将被替换后的行内容写到指定的文件中

sed  -n  ‘s/north/NORTH/gp‘  test.in        全局替换并打印

sed  -n  ‘s/north/NORTH/w  data‘  test.in    替换后的行写入到data文件

sed  ‘s/[0-9][0-9]$/&.5/‘  datafile      :一个示例    datafile中为qw12   ====>   qw12.5

&符号用在替换字符串中时,代表 被替换的字符串

 

r: 读文件,将另一个文件中的内容附加到指定行之后

sed  ‘$r  data‘  test.in     将data文件内容到test.in文件末尾

 

w:写文件,将指定行写入到另一个文件中

sed  -n  ‘/public/w  data2‘  test.in  :

 

n:将指定行的下面一行读入编辑缓冲区

sed  -n  ‘/public/{n;s/north/NORTH/p}‘  test.in         将包含public行的下一行读入缓冲区,并对缓冲区进行替换输出

sed  -n  ‘/public/n;s/north/NORTH/p‘  test.in        将public下一行读入缓冲区,不操作;再将所有north行替换输出。这是两个编辑命令,与上面的不一样。

对指定行同时使用多个sed编辑命令时,需要大括号“{ }”括起来,命令直接用分号";"隔开。注意与-e的区别

 

四、sed命令配合正则表达式的应用

以下两个命令都能显示vsftpd.conf中的配置行

grep  -v  ‘^#‘   /etc/vsftpd/vsftpd.conf      :#开头,取出所有注释行 ,未去除空行。 -v  反向匹配   

cat  /etc/vsftpd/vsftpd.conf | sed ‘s/^#.*//g‘ | sed ‘/^$/d‘      : 先替换掉所有#行,再去除所有空行

 

以上是关于shell编程之sed的主要内容,如果未能解决你的问题,请参考以下文章

Linux之shell脚本编程

Linux之shell编程

Linux之shell编程

Linux之shell编程

Linux之shell编程

linux之shell编程基本语法