侧边栏壁纸
博主头像
faneok博主等级

重剑无锋,大巧不工

  • 累计撰写 33 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

sed命令详解

faneok
2025-07-13 / 0 评论 / 0 点赞 / 54 阅读 / 7572 字

sed(Stream Editor)是 Linux/Unix 系统中一个强大的文本处理工具,支持正则表达式,可以对输入流(文件或管道)进行非交互式的编辑操作。


1. sed 基本语法

sed [选项] '命令' 输入文件
sed [选项] -f 脚本文件 输入文件

2. sed 常用选项(参数)

选项 说明
-n 禁止默认输出(仅打印受影响的文本)
-i 直接修改文件(-i.bak可备份原文件)
-e 指定多个编辑命令(sed -e 'cmd1' -e 'cmd2'
-f 从脚本文件读取 sed命令
-E-r 启用扩展正则表达式(ERE)
-l 指定行长度(很少用)
--debug 调试模式(GNU sed支持)

3. sed 基本命令

(1)行选择

命令 说明
n 读取下一行(跳过当前行)
p 打印当前行(通常与 -n一起使用)
d 删除当前行
q 退出 sed(处理到指定行后停止)

示例:

sed '1d' file.txt          # 删除第1行
sed '1,5d' file.txt        # 删除1-5行
sed '/pattern/d' file.txt  # 删除匹配 "pattern" 的行
sed -n '1,5p' file.txt     # 仅打印1-5行
sed '5q' file.txt          # 处理到第5行后退出

(2)文本替换(s 命令)

命令 说明
s/old/new/ 替换每行第一个匹配的 oldnew
s/old/new/g 替换所有匹配的 oldnew
s/old/new/2 替换每行第2个匹配的 old
s/old/new/i 忽略大小写替换
s/old/new/p 打印替换成功的行(通常与 -n一起使用)

示例:

sed 's/foo/bar/' file.txt         # 替换每行第一个 "foo" 为 "bar"
sed 's/foo/bar/g' file.txt        # 全局替换
sed 's/foo/bar/2' file.txt        # 替换每行第2个 "foo"
sed 's/foo/bar/i' file.txt        # 忽略大小写替换
sed -n 's/foo/bar/p' file.txt     # 仅打印替换成功的行

(3)行编辑

命令 说明
a\text 在当前行后追加 text
i\text 在当前行前插入 text
c\text 替换当前行(整行替换)
r file 读取文件内容并插入到当前行后
w file 将匹配的行写入文件

示例:

sed '2a\Hello' file.txt       # 在第2行后追加 "Hello"
sed '3i\World' file.txt       # 在第3行前插入 "World"
sed '/foo/c\New Line' file.txt # 替换包含 "foo" 的行为 "New Line"
sed '/foo/r data.txt' file.txt # 在匹配 "foo" 的行后插入 data.txt 的内容
sed -n '/foo/w output.txt' file.txt # 将匹配 "foo" 的行写入 output.txt

(4)多行操作

命令 说明
N 读取下一行并合并到当前行(多行模式)
P 打印多行模式的第一行
D 删除多行模式的第一行

示例:

sed 'N;s/\n/ /' file.txt      # 合并两行为一行(用空格分隔)

(5)分支和标签

命令 说明
b label 跳转到标签 label
t label 如果替换成功,跳转到 label
:label 定义标签 label

示例:

sed '/foo/{ s/foo/bar/; b end; }; :end' file.txt  # 匹配 "foo" 后替换并跳转

4. sed 高级用法

(1)正则表达式

表达式 说明
^ 匹配行首
$ 匹配行尾
. 匹配任意字符
* 匹配前一个字符0次或多次
\+ 匹配前一个字符1次或多次(-E启用)
\? 匹配前一个字符0次或1次(-E启用)
[abc] 匹配 abc
[^abc] 匹配非 abc的字符
\(...\) 分组捕获(\1引用)

示例:

sed -E 's/(foo)(bar)/\2\1/' file.txt  # 交换 "foo" 和 "bar"

(2)变量和引用

var="hello"
sed "s/foo/$var/" file.txt  # 使用 Shell 变量

5. 常见 sed 示例

(1)删除空行

sed '/^$/d' file.txt

(2)删除行首/行尾空格

sed 's/^[ \t]*//;s/[ \t]*$//' file.txt

(3)在行首/行尾添加内容

sed 's/^/HEADER /' file.txt    # 每行开头加 "HEADER"
sed 's/$/ TAIL/' file.txt      # 每行结尾加 "TAIL"

(4)仅处理匹配的行

sed '/pattern/{s/foo/bar/;s/baz/qux/}' file.txt

6. 总结

  • sed 主要用于 文本替换、删除、插入、打印 等操作。
  • 常用命令:s(替换)、d(删除)、p(打印)、a/i/c(插入/追加/替换行)。
  • 结合正则表达式可以处理复杂的文本操作。
  • -i 直接修改文件,-n 禁止默认输出。

掌握 sed 可以极大提高 Linux 下的文本处理效率!🚀

0

评论区