SED 流编辑器高级使用指南
sed (Stream Editor) 是一种流编辑器,能够配合正则表达式实现复杂的文本过滤与转换任务。
Bash
sed [选项] '命令' 文件名
sed [-nefri] 'command' test.txt
| sed | command | |||
|---|---|---|---|---|
| sed | -e | 可以指定多个命令 | a | 新增 |
| -f | 指定命令文件 | c | 整行替换 | |
| -n | 取消默认控制台输出,与p一起使用可打印指定内容 | d | 删除 | |
| -i | 输出到原文件,静默执行(修改原文件的意思) | i | 插入 | |
| p | 打印,要和-n参数一起使用 | |||
| s | 替换(匹配局部替换) |
| 选项 | 说明 |
|---|---|
-n |
取消默认输出。配合 p 命令可仅显示指定内容。 |
-e |
多点编辑。允许在一条命令中执行多个操作指令。 |
-f |
执行脚本文件。从指定的文件中读取编辑命令。 |
-i |
原地修改。直接修改源文件内容(静默执行)。 |
-r |
使用扩展正则表达式(简化特殊符号的转义)。 |
| 命令 | 说明 |
|---|---|
a |
新增 (Append):在目标行之后插入文本。 |
i |
插入 (Insert):在目标行之前插入文本。 |
c |
替换行 (Change):将选定的行替换为新的整行文本。 |
d |
删除 (Delete):删除选定的行。 |
p |
打印 (Print):输出选定的行,需配合 -n 使用。 |
s |
替换字符串 (Substitute):匹配局部文本并替换。 |
单行定位:2 代表第 2 行;$ 代表最后一行。
范围定位:1,3 代表第 1 到第 3 行。
正则定位:/pattern/ 代表匹配包含该模式的行。
反选定位:/pattern/! 代表操作不包含该模式的行。
sed '2a testContent' file:在第 2 行后新增一行。
sed '1,3i testContent' file:在第 1-3 行每行前各插入一行。
sed '1,3d' file:删除第 1-3 行。
sed -n '/match/p' file:打印匹配到 match 的行。
sed -i "/$match/!d" file:删除不匹配变量 $match 的行(需用双引号)。
sed 's/old/new/gi' file:全局替换且忽略大小写。
sed '3,9s/old/new/g' file:仅在第 3-9 行执行全局替换。
sed -n 's/old/new/gp' file:仅打印发生了替换的行。
sed -e 's/系统/00/g' -e '2d' test.txt :执行多个指令
sed -f ab.log test.txt : 多个命令写进ab.log文件里,一行一条命令,效果同-e
| 元字符 | 说明 | 示例 |
|---|---|---|
^ |
匹配行首 | /^root/ 匹配以 root 开头的行 |
$ |
匹配行尾 | /bash$/ 匹配以 bash 结尾的行 |
. |
匹配任意单个字符 | s/r..t/root/g |
* |
匹配前一个字符 0 次或多次 | s/a*/b/g |
[] |
匹配字符集内的任意字符 | /[0-9]/ 匹配含有数字的行 |
\& |
引用匹配到的整个字符串 | s/word/[&]/g 将 word 替换为 [word] |
通过 \(\) 将匹配内容分组,并用 \1, \2 等进行调用:
交换两列位置:
sed 's/(col1) (col2)/\2 \1/' file
提取 IP 地址关键部分:
echo "ip:192.168.1.1" | sed 's/ip:(.*)/\1/'
使用单引号:sed 's/old/new/g'。优点是稳定,不会被 Shell 解析,但无法直接引用变量。
使用双引号:sed "s/$old/$new/g"。当命令中包含 Shell 变量时必须使用双引号。
多点编辑:sed -e 's/A/B/g' -e '2d' file
删除空行:sed '/^$/d' file
删除行首空格:sed 's/^[ \t]*//g' file
批量修改配置:sed -i "s/TIMEOUT=30/TIMEOUT=60/g" config.conf