Skip to content

sed 命令是什么

sed, 即 Linux 上的流编辑器, 能够结合正则表达式进行文本处理。

替换操作

替换操作: s 命令

替换每行第一个匹配的值,打印替换结果,不对文件做实际修改。

bash
sed 's/oldValue/newValue/' file

-n 选项 和 p 命令

替换每行第一个匹配的值,只打印被替换的行,不对文件做实际修改。

shell
sed -n 's/oldValue/newValue/p' file

全面替换命令: g 命令

替换每行所有匹配的值,打印替换结果,不对文件做实际修改。

shell
sed 's/oldValue/newValue/g' file

替换后保存: i 选项

配合使用 -isg ,替换每行所有匹配的值,不打印替换结果,对文件做实际修改。

shell
sed -i 's/oldValue/newValue/g' file

从该行第N处匹配开始替换:/Ng

shell
echo "ababababab" | sed 's/ab/AB/3g'

定界符: /

以上命令均使用 / 作为定界符,也可以使用其他任意的定界符,比如 :、 **|**等

shell
echo "abababab" | sed 's:ab:AB:g'
echo "abababab" | sed 's|ab|AB|g'

但是当定界符出现在 被匹配、要替换成的内容 时需要进行转义

shell
echo "ab:ab:ab:ab" | sed 's:\:ab:\:AB:g'
echo "ab|ab|ab|ab" | sed 's|\|ab|\|AB|g'

删除操作: d 命令

删除空白行

shell
# 只打印,不修改文件,如要修改,加上 -i 选项
sed '/^$/d' file

sed -n '/./p' file

删除文件的第 N 行

shell
# 删除第 2 行,打印结果,不删除文件内容
sed '2d' file

# 删除第 3 行到末尾的所有行,打印结果,不删除文件内容
sed '3,$d' file

# 删除最后一行,打印结果,不删除文件内容
sed '$d' file

# 删除所有开头是Hello的行,打印结果,不删除文件内容
sed '/^Hello/d' file

# 删除所有结尾是Hello的行,打印结果,不删除文件内容
sed '/Hello$/d' file

以上操作如要修改文件内容,加上 -i 选项

追加: a\ 命令

shell
# 在以 Hello 开头的行后面添加 world
sed '/^Hello/a\world' file

# 在第 N 行后插入 world,例如第 2 行后
sed '2a\world' file

以上操作如要修改文件内容,加上 -i 选项

插入: i\ 命令

shell
# 在以 Hello 开头的行前面添加 world
sed '/^Hello/i\world' file

# 在第 N 行前插入 world,例如第 2 行后
sed '2i\world' file

以上操作如要修改文件内容,加上 -i 选项

替换指定行: c\ 命令

shell
# 将以 Hello 开头的行替换成 world
sed '/^Hello/c\world' file

# 指定一个范围,作为一个整体被替换,如将前 3 行作为一个整体替换成 world
sed '1,3c\word' file

那如果是想将前 3 行的每一行都替换成 world,name可以使用循环指令

shell
sed '1{:m;s/.*/world/;n;4!bm}' file

TIP

:m 是设置一个循环标签
s/.*/world/ 是用 world 字符替换匹配到的每行内容
n 是读取下一行
4! 是读到第四行退出循环,终止操作,如果没有,则继续循环。
bm 是如果没有到第四行就跳转到 m 继续循环

以上操作如要修改文件内容,加上 -i 选项

多点编辑: e 选项

-e 选项允许在同一行里执行多条命令,且命令的执行顺序对结果是有影响的,排在后面的命令是针对前面命令的执行结果做的操作。

shell
# 删除前 2 行后,对每一行的 Hello 替换成 Hi
sed -e '1,2d' -e 's/Hello/Hi/g' file

以上操作如要修改文件内容,加上 -i 选项

从文件读取: r 命令

shell
# 从 otherFile 读取内容,显示在 file 文件中以 Hello 开始的行的下面
# 只打印,file 文件内容未修改,若要修改,可加上 -i 选项
sed '/^Hello/r otherFile' file

写入文件: w 命令

shell
# 将 file 文件中以 Hello 开始的行,都写入到 otherFile 中, otherFile 立即生效且覆盖原有内容
sed '/^Hello/w otherFile' file

已匹配标记: &

& 标记代表匹配的每一个值

shell
echo "中文 English 33" | sed 's/\w\+/[&]/g' // [中文] [English] [33]

echo "中文 English 33" | sed 's/\w\+/&@/g'  // 中文@ English@ 33@

Released under the MIT License.