介绍
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 | old_hadoop=hadoop |
- 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 |