简介
sed(Stream EDitor),是一种流文件编辑器,其特点为:
1、非交互式。处理文件时,把当前处理的行存储在临时缓冲区(称为“模式空间”(Pattern Space))中,即它是基于模式匹配过滤及修改文本。
2、逐行处理,sed 命令在缓冲区中一次处理一行内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
命令调用形式
sed [选项] '[定址符]处理动作’文件 [input-file]
选项说明
-i:直接修改文件内容,而不是输出到终端。(该选项会直接修改目标文件内容,如果后面跟的动作是修改、替换、删除等操作指令,应谨慎使用)
-n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来。
-e :指定sed动作,可以由多个-e指定多个动作。
-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename 内的sed动作;
--help:显示帮助。
--version:显示版本。
动作说明
[n1[,n2]] function
其中[n1[,n2]]称为定址符,用来定义需要操作的文本,如指定处理的起、止行数,甚至是正则表达式。如果n1,n2不存在,则表示全部
fuction为编辑指令,可以为增删改查等指令
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何内容;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)行前插入数据;
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,通常这个s的动作可以搭配正规表示法!例如 1,20s/old/new/g
示例
创建示例操作文件test.txt,内容如下:
显示2到4行的内容
sed -n "2,4p" test.txt
此处使用-n选项将结果输出到屏幕,如果使用-i选项会是什么结果?
显示第2行和第四行的内容
sed -n "2p;4p" test.txt
注意,此处两命令的差别,一个使用的是逗号",",一个使用的是分号(表示的是2个动作)
在2到4行新增数据
对比一下输出结果可知,符合预期。注意,此处是没有直接把修改内容写入实际文件的,如果需要实际写入文件,使用-i选项参数
修改以xxx开头的文件内容
sed "/^li/s/ne/test/" test.txt
这里使用"/^li"表示命中所有以li字符串开头的行,然后通过s动作参数,使用test字符串替换ne字符串,注意:这里未添加"-i"选项没有把改变直接写入源文件
插入数据
sed "2i this is test insert" test.txt
注意:这里未添加"-i"选项没有把改变直接写入源文件
替换行内容
sed "/^li/c test" test.txt
这里的动作参数使用c表示直接整行替换,c动作参数后面的字符串"test"用于替换整行
注意:这里未添加"-i"选项没有把改变直接写入源文件
字符串替换
sed "/^li/s/line/change/" test.txt
这里使用"change"字符串替换"line"字符串,其中的符号"/"
实际案例分享
公司有海外业务部署在海外服务器上,而api调用客户端服务器部署在国内,不能直接调用,为此搭建了一个nginx反向代理服务,通过nginx调用到海外。而海外服务器使用的域名,ip会经常变动,为此,希望编写一个脚本,通过修改nginx的挂载配置文件,达到快速修改nginx反向负载的配置的目的:
nginx的配置内容如下:
脚本内容如下:
这样后续就只需要输出参数,调用脚本即可修改。不用再使用交互式的命令vi。甚至后续可以通过java程序堆外提供http服务直接调用该脚本完成,大大提升了效率