一、简介

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

命令格式

1
sed [options] 'command' file(s)

二、sed命令

  • a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(当前行的下一行)。
  • d :删除,删除选择的行。
  • i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(当前行的上一行).
  • p :打印,通常 p 会与参数 sed -n 一起运行.
  • s :替换,替换指定字符,通常与正则表达式联用。

三、使用场景

1. sed 增加(i/a)

指定行号添加内容

1
2
3
4
# 在第三行的上方添加一行字符串
sed -i "3i\test123" aa.txt
# 在第三行的下方添加一行字符串
sed -i "3a\ceshi456" aa.txt

匹配行之后在其上方/下方添加内容

1
2
3
4
# 在vrrp_instance VI_1下方插入内容
sed -i '/vrrp_instance VI_1/a\ notify_master \"/etc/keepalived/xmha/keepalived.sh master\"\n notify_backup \"/etc/keepalived/xmha/keepalived.sh backup\"\n track_script {\n check\n }' keepalived.conf
# 在vrrp_instance VI_1上方插入内容
sed -i '/vrrp_instance VI_1/i\vrrp_script check {\n script \"/etc/keepalived/xmha/checkServer.sh\"\n interval 10\n}\n' keepalived.conf

解读:

  • a:代表apend,是在匹配行追加的意思。字母前面跟行号或匹配的内容。
  • i:代表insert,是在匹配行插入的意思。字母前面跟行号或匹配的内容。
  • \n:换行,可通过该参数插入多行内容。
  • \:转义符。

2. sed 输出(p)

1
2
3
4
5
6
# 输出文件所有内容
sed -n '1,$p' /etc/hosts
# 将每行内容放到一行上进行展示,每行内容以逗号进行分隔。
sed ':t;N;s/\n/,/;b t' /etc/hosts
# 输出第二行到第四行之间三行的内容
sed -n "2,4p" /etc/hosts

解读:

$p为最后一行的意思,'1,$p',是选择打印第一行到最后一行。必须用单引号表示,双引号会报错。

3. sed 替换(s)

  • 全文匹配替换
1
sed -i "s/http:\/\/.*/http:\/\/$ip:$1\";/g" app.js

app.js的局部内容

1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://10.6.6.71:9200";

解读:

动态替换全文匹配http://行之后的内容。\为转义符,用来转义/.*代表所有内容。

  • 指定行号匹配替换
1
sed -i "5s/port:.*/port: $2,/g" ../Gruntfile.js

Gruntfile.js的局部内容

1
2
3
4
5
6
7
8
9
connect: {
server: {
options: {
port: 9100,
base: '.',
keepalive: true
}
}
}

解读:

替换第4行的匹配的port之后的内容,.*代表所有内容。

注意:

首先要搞清楚,转义符 \ 的作用是消除有特殊含义字符的特殊意义,使其还原为普通字符。

其实 sed 的替换命令格式不一定要是 s/…/…/,下面这样也都可以:

  • s#…#…#
  • s_…

即命令 s 后可以跟任意字符,只要跟替换内容不重复即可。这样,路径里的 / 就不再需要转义了。

4. sed 删除(d)

1
2
3
4
5
6
7
sed -i "/notify_master \"\/etc\/keepalived\/xmha\/keepalived.sh master\"/,+4d" keepalived.conf

# 远程主机删除文件内容
ssh 10.6.6.72 "sed -i '/notify_master \"\/etc\/keepalived\/xmha\/keepalived.sh master\"/,+4d' /etc/keepalived/keepalived.conf"

# 有特殊符号的行应该如何匹配删除
sed -i "/.*30 1 \* \* \* root sh \/etc\/keepalived\/xmha\/checkFile.sh/d" /etc/crontab

解读:

如果匹配字符串中有*/等特殊符号时,就需要转义符\来转义。

四、总结

本篇文章主要描述了sed命令的基本用法,如何对文件内容进行增删改查,并附上了我自己工作上遇到的小例子。当然,sed命令博大精深,我不可能每个用法都能兼顾,如果还想继续拓展的话,可以访问http://man.linuxde.net/sed学习sed更多用法。