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的主要内容,如果未能解决你的问题,请参考以下文章