sed命令

介绍

sed(Stream Editor) , 流编辑器。对标准输出或文件逐行处理

语法格式
  • 第一种形式
1
$ stdout | sed [option] "pattern command"
  • 第二种形式
1
$ sed [option] "pattern command" file
sed中选项(option)
选项 含义
-n 取消默认输出
-e 多点编辑,可以执行多个子命令
-i 直接修改文件内容
-r 支持扩展正则表达式
正则的一些基本知识点(下文会用到)
  • ^ 表示一行的开头
1
/^#/      # 以#号开头的匹配
  • $表示一行的结尾
1
/root$/   # 以root结尾的匹配
  • .表示任何单个字符
  • *表示某一个字符出现了0次或多次
  • []表示字符集合
1
[ABC]    # 表示匹配A或B或C
sed中pattern详解(重要
  • LineNumber (直接指定行号)

打印file中17行

1
$ sed -n '17p' file

其中的p表示打印,下面讲解编辑命令会提到

  • StartLine,EndLine (指定起始行到结束行号)

打印file中10到12行

1
$ sed -n '10,12p' file
  • StartLine,+N (指定起始行然后到后面N行)

打印file中从第10行开始,往后面加5行的内容

1
$ sed -n '10,+5p' file
  • /pattern1/ (正则表达式匹配)

打印file文件中以root开头的行

1
$ sed -n '/^root/p' file

打印file文件中中包含字符为 /sbin/halt 的行

1
$ sed -n '/\/sbin\/halt/p' /etc/passwd

匹配字符中 /sbin/halt 带有斜杠 / 在匹配时,需要用反斜杠 \ 转义

  • /pattern1/,/pattern2/ (从匹配到pattern1的行,到匹配到pattern2的行)

打印file文件中第一个匹配到以ftp开头的行,到第二个匹配到以mail开头的行

1
$ sed -n '/^ftp/,/^mail/p' file
  • LineNumber,/pattern1/ (从指定行号开始匹配,直到匹配到pattern1的行)

打印file中从第4行开始匹配,直到匹配到以hdfs开头的行

1
$ sed -n '4,/^hdfs/p' file

如果指定LineNumber的行

​ 在匹配目标字符前面,则输出的是从LineNumber行到目标字符行的所有内容

​ 在匹配目标字符后面,则输出的是从LineNumber行一直到文件末尾的所有内容

sed中编辑命令(command)详解
类别 含义
查询
p 打印
增加
a 行后增加
i 行前增加
r 外部文件读入,行后增加
w 匹配行,写入外部文件
删除
d 删除
修改
s/old/new 将行内第一个old替换为new
s/old/new/g 将行内全部的old替换为new
s/old/new/2g 将行内从第二2个开始到后面所有的old替换为new
s/old/new/ig 将行内全部的old替换为new,忽略大小写
取代
c 替换匹配行

备注,下文提到的文件 file,读者可以使用 /etc/passwd 文件作为练习(记得拷贝一份)

案例中的示例都是基于下方的形式:
1
'pattern command'

其中的

​ pattern:是上文提到的几种形式

​ command:是下文提到的 比如:p是打印,d是删除等

  • d (删除)

删除源文件中以ftp开头的行到mail结束的行

1
$ sed -i '/^ftp/,/^mail/d' file

在讲解sed中pattern的时候,我们已经用过编辑命令 p 的功能,其它功能都可以使用 pattern讲解中的形式

  • a (增加,行后)

在file中匹配到root的行,在其行后增加字符 “123”

1
$ sed -i '/root/a 123' file
  • r (将后面指定文件的内容追加到匹配到行后面)

在file中匹配到root的行,将当前路劲下文件append.txt中的内容,添加到匹配行的后面

1
$ sed -i '/root/r append.txt' file
  • w (将匹配到行内容,另存到其它文件中)

在file中匹配到/bin/bash的行保存在/etc/result.log文件中

1
$ sed -n '/\/bin/\bash/w /etc/result.log' file
  • s/pattern/string/ig (将匹配到行内容,另存到其它文件中)

在file中匹配到不区分大小写的hadoop的字符替换为hive

1
$ sed -i 's/hadoop/hive/ig' file
  • = (将匹配到行,只显示行号,不显示内容)

在file中匹配到root的行,只显示行号,不输出内容

1
$ sed -n '/root/=' file
  • & 和 \1 (反向引用,引用模式匹配到的整个串)

在file文件中匹配到springcl..d的字符,在后面加上字符abc

1
$ sed -i 's/springcl..d/&abc/g' file

sed 中引用变量时,则建议使用双引号,否则会将变量当做普通字符串来处理

1
2
3
old_hadoop=hadoop
new_hadoop=HADOOP
$ sed -i "s/$old_hadoop/$new_hadoop/g" file # 使用双引号引起来
  • c

匹配字符daemon的行,替换为字符 input repalce content

1
$ sed '/daemon/c input repalce content' file
  • 多行匹配

在file文件中匹配到以ssh字符开头的行,替换第一个字符sshd为hive和匹配以false结尾的字符的行,在行前面插入内容 ABC

1
$ sed  '/^ssh/s/sshd/hive/1g; /false$/i ABC' file

上面的命令等价于:(使用sed的-e命令行参数)

1
$ sed -e '/^ssh/s/sshd/hive/1g' -e '/false$/i ABC' file