sed基本用法:作用/格式/定址方式
sed过滤指令:常见的处理动作
文本块处理:插入/替换行、多行文本
sed文本处理
Stream EDitor,流式编辑器
非交互,基于模式匹配过滤及修改文本
逐行处理,并将结果输出到屏幕
可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作(vim无法在脚本中使用)
一、sed基本用法
语法格式:
格式1:命令 | sed [选项] '编辑指令'
格式2:sed [选项] '编辑指令' 文件 .. .. #编辑指令->[定址符]处理动作
#定址符->[地址1,[地址2]]
示例:
$ grep ^s /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ sed -n '/^r/p' /etc/inittab
root:x:0:0:root:/root:/bin/bash #列出以r开头的行
常见命令选项
-n: 屏蔽 默认输出全部文本 -> 只输出与条件匹配的结果
-i: 直接修改文件内容
-e: 可指定多个处理动作
-r: 启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{}: 可组合多个命令,以分号分隔
定址符,即[地址1,[地址2]]
用来指定处理的起、止行数(起始位置、结束位置)
省略定址符时,默认逐行处理全部文本
地址可表示为文本的“行号”,或者用来匹配的“/正则表达式/”
示例:
$ sed -n '2,4p' /etc/hosts //输出第2-4行
$ that require network functionality willfail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localhost6 localhost6
二、sed过滤指令
1.处理动作
操作符 | 用途 | 指令示例 |
---|---|---|
p | 打印行 | 2,4p 输出2、3、4行 |
2p;4p 输出第2行、第4行 | ||
d | 删除行 | 2,4d 输出第2、3、4行 |
s | 字符串替换 | s/old/new/ 将每行的第1个old替换为new |
s/old/new/g 将所有的old都替换为new |
[注]替换操作的分隔符“/”可改用其他字符,如#、&等,便于修改文件路径(适用场景:old串中包含文件路径、避免混淆)
2.处理动作-打印
示例 | 含义解析 |
---|---|
sed -n ‘p’ a.txt | 输出所有行,等同于cat a.txt |
sed -n ‘4p’ a.txt | 输出第4行 |
sed -n ‘4,+10p’ a.txt | 输出第4行及其后的10行内容 |
sed -n ‘/^bin/p’ a.txt | 输出以bin开头的行 |
sed -n ‘p;n’ a.txt | 输出奇数行,n表示读入下一行文本(隔行) |
sed -n ‘n;p’ a.txt | 输出偶数行,n表示读入下一行文本(隔行) |
sed -n ‘$=’ a.txt | 输出文件的行数 |
3.处理动作-删除
示例 | 含义解析 |
---|---|
sed ‘3,5d’ a.txt | 删除第3-5行 |
sed ‘/xml/d’ a.txt | 删除所有包含xml的行 |
sed ‘/xml/!d’ a.txt | 删除不包含xml的行,!符号表示取反 |
sed ‘$d’ a.txt | 删除文件的最后一行 |
sed ‘/^$/d’ a.txt | 删除所有空行 |
sed ‘/^$/{n;/^$/d}’ a.txt | 删除重复空行,连续两个空行只保留一个 |
[注]此例中只作输出,不更改原文件(若需要更改,应添加选项-i)
4.处理动作-替换
示例 | 含义解析 |
---|---|
sed ‘s/xml/XML/’ a.txt | 将每行中第一个xml替换为XML |
sed ‘s/xml/XML/3’ a.txt | 将每行中的第三个xml替换为XML |
sed ‘s/xml/XML/g’ a.txt | 将所有的xml都替换为XML |
sed ‘s/xml//g’ a.txt | 将所有的xml都删除(替换为空串) |
sed ‘s/doc/&s/g’ a.txt | 将所有的doc都替换为docs,&代表查找串 |
sed ‘4,7s/^/#/’ a.txt | 将第4-7行注释掉(行首加#号) |
sed ‘s/^#an/an/’ a.txt | 接触以#an开头的行的注释(去除行首的#号) |
[注]此例中只作输出,不更改原文件(若需要更改,应添加选项-i)
5.sed实际应用1
1)修改网站根目录:将/var/www/html修改为/opt/wwwroot
$ grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html" # 修改前
$ sed -i 's#/var/www/html#/opt/wwwroot' \
/etc/httpd/conf/httpd.conf # 修改操作;#号为分隔符,避免与路径分隔符混淆
$ grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/opt/wwwroot" # 修改后
三、文本块处理
1.sed文本块处理1
操作符 | 用途 | 指令示例 | 含义解释 |
---|---|---|---|
i | 行前插入文本 | 2iYY | 在第2行之前添加文本行 |
4,7iYY | 在第4-7行的每一行前添加文本行 | ||
a | 行后插入文本 | 2aYY | 在第2行之后添加文本 |
/^XX/aYY | 在以XX开头的行之后添加文本 | ||
c | 替换当前行 | 2cYY | 将第2行的内容修改为"YY" |
2.sed文本块处理2
$ cat m.txt
1111111 HelloShell
22222 IT Group
$ sed '2iXX' m.txt
1111111 HelloShell
XX # 输入到行前
22222 IT Group
$ sed '2aXX' m.txt
1111111 HelloShell
222 IT Group
XX # 插入到行后
$ sed '2cXX' m.txt
1111111 HelloShell
XX # 替换指定行
3.多行文本处理
修改后的文本有多行时: 以换行符\n分隔
或,使用\强制换行(交互式)
$ sed -n '2cXX\nYY' m.txt
XX
YY
$ sed -n '2cXX\
> YY' m.txt
XX
YY
4.sed行替换 实际应用——修改主机名
- 找到主机名配置文件中的HOSTNAME行
- 整行替换为新的主机名设置
$ grep ^HOSTNAME /etc/sysconfig/network
HOSTNAME=svr5.hiai.com # 修改前
$ sed -i '/^HOSTNAME/cHOSTNAME=mysvr.hi\
ai.com' /etc/sysconfig/network # 整行替换操作
$ grep ^HOSTNAME /etc/sysconfig/network
HOSTNAME=mysvr.hiai.com # 修改后