sed命令笔记250419
sed(Stream Editor)是 Linux/Unix 系统中强大的流编辑器,主要用于对文本进行过滤和转换(按行处理)。它支持正则表达式,适合处理文本替换、删除、插入等操作。以下是 sed 的详细解析:
一、基本语法
sed [选项] '命令' 输入文件
sed [选项] -f 脚本文件 输入文件 # 从脚本文件读取命令
二、常见选项
| 选项 | 说明 |
|---|---|
-n | 静默模式,仅输出处理后的行(常与 p 命令搭配) |
-e | 指定多个命令,如 sed -e '命令1' -e '命令2' |
-i | 直接修改文件内容(慎用,建议先备份)-i.bak 修改前备份原文件为 .bak |
-r | 使用扩展正则表达式(如 +, |, () 等) |
-E, -r, --regexp-extended | 从指定文件中读取命令 |
三、编辑命令(核心)
1. 替换命令 s
s/pattern/replacement/flags
- flags 常用值:
g:全局替换(默认每行仅替换第一个匹配)p:替换后打印行(需与-n选项配合)i:忽略大小写数字:替换第 N 个匹配
- 示例:
echo "hello world" | sed 's/hello/hi/' # 输出 hi world echo "a a a" | sed 's/a/b/2' # 替换第二个a:a b a
2. 删除命令 d
sed '地址定界d' 文件 # 删除匹配行
sed '3d' file # 删除第3行
sed '/^$/d' file # 删除所有空行
3. 插入/追加行
| 命令 | 说明 |
|---|---|
i\ | 在行前插入内容(如 sed '2i\插入内容' file) |
a\ | 在行后追加内容(如 sed '2a\追加内容' file) |
4. 其他命令
| 命令 | 说明 |
|---|---|
p | 打印行(常与 -n 配合:sed -n '1p' file 打印第1行) |
= | 显示行号(如 sed '=' file) |
y | 字符转换(如 sed 'y/abc/ABC/' 将a→A, b→B, c→C) |
r | 读取文件并插入(如 sed '/pattern/r otherfile' file) |
w | 将匹配行写入文件(如 sed '/pattern/w output.txt' file) |
四、地址定界(指定操作范围)
| 格式 | 说明 |
|---|---|
n | 第 n 行(如 sed '3s/a/b/' 修改第3行) |
n,m | 第 n 到 m 行(如 1,5d 删除1-5行) |
$ | 最后一行 |
/pattern/ | 匹配正则的行(如 /^#/d 删除注释行) |
n,+m | 从第n行到其后m行(如 2,+3 表示2-5行) |
! | 取反(如 3!d 删除除第3行外的所有行) |
五、替换命令 s 的进阶用法
1. 分组与反向引用
sed 命令中的分组(Grouping)是正则表达式的重要功能,通过 () 将部分模式标记为一个整体,并可通过反向引用在替换操作中重用这些分组内容。
echo "123-456" | sed -r 's/([0-9]+)-([0-9]+)/\2-\1/' # 输出 456-123
()分组,\1,\2引用分组。 从\1开始, 第一个是\1- ⚠️
sed不支持(?:)语法,所有()均为捕获分组。
2. 特殊字符转义
若替换内容包含 /,可更换分隔符(如 s|/old|/new|)。
3. 动态替换
使用 & 引用匹配的整个内容:
echo "123" | sed 's/[0-9]\+/数字:&/' # 输出 数字:123
分组详解
sed 命令中的分组(Grouping)是正则表达式的重要功能,通过 () 将部分模式标记为一个整体,并可通过反向引用在替换操作中重用这些分组内容。
⚠️ sed 不支持 (?:) 语法,所有 () 均为捕获分组。
一、分组的基本语法
1. 创建分组
使用 \( 和 \) 包裹正则表达式(基础正则语法):
echo "abc123" | sed 's/\([a-z]\+\)[0-9]\+/\1/' # 输出 abc
# 解析:
# - \([a-z]\+\) 匹配字母部分,并标记为分组1
# - \1 反向引用分组1的内容
2. 扩展正则表达式
若使用 -r(GNU sed)或 -E(macOS),可省略转义符:
echo "abc123" | sed -r 's/([a-z]+)[0-9]+/\1/' # 输出 abc(更简洁)
二、分组的核心用途
1. 提取并重组内容
# 将日期格式从 "YYYY-MM-DD" 改为 "DD/MM/YYYY"
echo "2023-10-05" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# 输出:05/10/2023
# 分组1: 2023, 分组2: 10, 分组3: 05
2. 保留部分原始内容
# 在匹配的单词两侧添加方括号
echo "hello world" | sed -r 's/(\b\w+\b)/[\1]/g'
# 输出:[hello] [world]
3. 动态调整顺序
# 交换 "key: value" 为 "value: key"
echo "name: John" | sed -r 's/([^:]+):\s*(.+)/\2: \1/'
# 输出:John: name
三、高级分组技巧
1. 多级分组(嵌套分组)
分组按左括号顺序编号,从外到内、从左到右:
echo "12-34-56" | sed -r 's/(([0-9]{2})-){2}([0-9]{2})/\1\3/'
# 输出:12-3456
# 分组1: 12-34-, 分组2: 34, 分组3: 56
2. 与替换标志结合
结合 g(全局)或 i(忽略大小写)等标志:
# 将所有重复的单词合并(如 "hello hello" → "hello")
echo "hello hello world" | sed -r 's/\b(\w+)\b \1/\1/g'
# 输出:hello world
3. 非捕获分组(sed不支持)
⚠️ sed 不支持 (?:) 非捕获分组语法,所有 () 均为捕获分组。
四、分组在地址定界中的应用
分组也可用于匹配行的条件判断:
# 删除包含重复单词的行(如 "apple apple")
sed -r '/\b(\w+)\b \1/d' file.txt
六. 示例场景
1. 替换文件内容
sed -i 's/foo/bar/g' file.txt # 将所有foo替换为bar(直接修改文件)
sed -i.bak 's/old/new/' file.txt # 修改前备份原文件为file.txt.bak
2. 删除操作
sed '/^#/d' file.conf # 删除所有注释行(以#开头)
sed '/^$/d; /^$/d' file # 删除连续空行(保留单个空行需更复杂处理)
3. 处理指定行
sed '2,5s/yes/no/' file # 将2-5行的yes替换为no
sed '$a\This is the end' file # 在最后一行后追加内容
4. 多重命令
sed -e 's/foo/bar/' -e '/baz/d' file
sed 's/a/A/; s/b/B/' file # 多个命令用分号分隔
1. 处理日志文件
# 提取日志中的 IP 和访问路径(假设格式:IP - [时间] "GET /path HTTP/1.1")
cat access.log | sed -r 's/([0-9.]+).*"GET (\/[^ ]+).*/\1 \2/'
# 输出:192.168.1.1 /index.html
2. 格式化配置文件
# 将 "key=value" 改为 "key = value"
sed -r 's/([^=]+)=/\1 = /' config.ini
3. 处理 CSV 数据
# 交换 CSV 前两列(假设分隔符为逗号)
echo "apple,123,fruit" | sed -r 's/([^,]+),([^,]+)/\2,\1/'
# 输出:123,apple,fruit
七、注意事项
-
-i选项风险:直接修改原文件,建议先不加-i测试命令。 -
正则兼容性:默认支持基础正则,使用
-r或-E启用扩展正则。 -
行处理机制:
sed逐行处理,适合大文件,但复杂操作可能不如awk灵活。 -
转义括号:在基础正则中需用
\(和\),扩展正则(-r或-E)可直接用()。 -
分组数量:最多支持 9 个分组(
\1到\9)。 -
性能:复杂分组可能降低处理速度,尤其在大型文件中。
1️⃣ 参考 1
sed(Stream Editor)是 Linux/Unix 中强大的流式文本处理工具,主要用于对文本进行替换、删除、插入等操作。以下是 sed 的详细用法:
基本语法
sed [选项] '命令' 输入文件
sed [选项] -f 脚本文件 输入文件
常用选项
| 选项 | 作用 |
|---|---|
-n | 仅输出处理后的行(默认会输出所有行) |
-i | 直接修改文件内容(谨慎使用,建议先备份) |
-e | 指定多个命令(例如 sed -e '命令1' -e '命令2') |
-f | 从脚本文件读取命令 |
-E, -r, --regexp-extended | 使用扩展正则表达式(简化语法) |
常用命令
1. 替换文本:s
sed 's/原内容/替换内容/[标志]'
- 标志:
g:全局替换(默认只替换每行第一个匹配项)p:打印替换后的行(常与-n选项一起使用)i:忽略大小写(需配合-r或-E使用扩展正则)
示例:
sed 's/apple/orange/g' file.txt # 替换所有 apple 为 orange
sed -n 's/foo/bar/p' file.txt # 仅打印发生替换的行
sed -i 's/old/new/' file.txt # 直接修改文件
sed 's|/usr/bin|/usr/local/bin|g' # 使用 | 替代 / 作为分隔符
2. 删除行:d
sed '地址定界符 d' 文件
示例:
sed '3d' file.txt # 删除第3行
sed '/pattern/d' file.txt # 删除匹配 pattern 的行
sed '1,5d' file.txt # 删除1-5行
sed '/^$/d' file.txt # 删除所有空行
3. 插入/追加行:i 和 a
i:在指定行前插入a:在指定行后追加
示例:
sed '2i Insert this line' file.txt # 在第2行前插入一行
sed '/pattern/a Append this line' # 在匹配行后追加一行
4. 替换指定行号
sed '2s/old/new/' file.txt # 替换第2行的第一个 old 为 new
sed '1,5s/old/new/g' file.txt # 替换1-5行的所有 old 为 new
5. 地址定界(指定操作范围)
- 行号:
sed '3,5命令'(操作第3-5行) - 正则匹配:
sed '/pattern/命令'(操作匹配pattern的行)
示例:
sed '/start/,/end/d' file.txt # 删除从 start 到 end 的所有行
sed '/^#/d' file.txt # 删除所有注释行(以 # 开头)
高级用法
1. 多命令执行
sed -e 's/foo/bar/' -e '/pattern/d' file.txt
# 或
sed 's/foo/bar/; /pattern/d' file.txt
2. 保持空间(Hold Space)
h:将模式空间内容复制到保持空间H:将模式空间内容追加到保持空间g:将保持空间内容复制到模式空间G:将保持空间内容追加到模式空间
示例(反转文件行序):
sed -n '1!G;h;$p' file.txt
3. 文件操作
sed 'r 文件2' 文件1 # 将文件2的内容插入到文件1的每行后
sed '/pattern/w 新文件' file.txt # 将匹配的行写入新文件
4. 转换字符:y
sed 'y/abc/XYZ/' file.txt # 将 a→X, b→Y, c→Z(类似 tr 命令)
常见使用场景
-
批量替换文件内容:
sed -i 's/old/new/g' *.txt -
删除空行或注释行:
sed -i '/^$/d; /^#/d' file.conf -
提取特定内容:
sed -n '/error/p' log.txt > errors.log -
行号处理:
sed = file.txt | sed 'N; s/\n/ /' # 显示行号(类似 nl) -
批量修改配置:
sed -i '/^Port /s/22/2222/' /etc/ssh/sshd_config # 修改SSH端口
注意事项
-i选项会直接修改文件,建议先不加-i测试命令。- 正则表达式中的特殊字符(如
*,$,^)需要转义。 - macOS 的
sed与 Linux 存在差异(如-i必须带参数:sed -i '' ...)。
通过灵活组合上述命令,可以高效处理文本任务!
2️⃣ 参考 2
sed命令详解
一、sed是什么?
sed(Stream Editor) 是 Linux 和类 Unix 系统中的流式文本编辑器,用于对文本进行高效处理和转换。它逐行读取文件,通过命令对文本进行增删改查操作,支持正则表达式,适合处理大量文本数据。
二、核心语法结构
sed [选项] '命令' 输入文件
- 常用选项:
-n:安静模式(不自动打印所有行,需配合p命令显式输出)。-i:直接修改文件内容(慎用,建议先不加-i测试)。-e:执行多个命令(如sed -e 's/a/b/' -e 's/c/d/' file)。-f:从脚本文件读取命令(sed -f script.sed file)。
三、基础命令与示例
1. 打印文本
- 打印第2行:
sed -n '2p' file.txt - 打印第1-3行:
sed -n '1,3p' file.txt - 打印包含"error"的行:
sed -n '/error/p' file.txt
2. 替换文本
- 替换每行第一个匹配项:
sed 's/old/new/' file.txt - 全局替换(所有匹配项):
sed 's/old/new/g' file.txt - 替换第3行的内容:
sed '3s/old/new/' file.txt
3. 删除文本
- 删除第3行:
sed '3d' file.txt - 删除空行:
sed '/^$/d' file.txt - 删除包含"error"的行:
sed '/error/d' file.txt
4. 插入/追加文本
- 在第2行前插入文本:
sed '2i\Insert this line' file.txt - 在第2行后追加文本:
sed '2a\Append this line' file.txt
四、高级功能
1. 多行处理命令
- 合并下一行到模式空间:
sed 'N' file.txt # 合并两行(如处理跨行日志) - 删除多行组中的单行:
sed 'D' file.txt # 删除模式空间的第一行 - 打印多行组中的单行:
sed -n 'P' file.txt # 打印模式空间的第一行
2. 模式空间与保持空间
- 复制模式空间到保持空间:
sed 'h' file.txt # h命令 - 将保持空间内容覆盖模式空间:
sed 'g' file.txt # g命令 - 示例:交换两行内容:
echo -e "line1\nline2\nline3" | sed -n '1h;2x;p' # 输出:line2(原第1行和第2行交换)
3. 分支与循环
- 条件分支:
sed '/pattern/b label' file.txt # 匹配pattern则跳转到label - 循环替换:
echo "This, is, a, test" | sed -n ':start; s/,//1p; t start' # 输出:This is a test(逐步删除逗号)
4. 正则表达式增强
- 子字符串匹配:
echo "System Administrator" | sed 's/\(System\) Administrator/\1 User/' # 输出:System User(\1引用第一个括号内容) - 扩展正则表达式(使用
-r或-E):sed -r 's/(http|https)://\1/g' file.txt # 提取URL协议
五、实用技巧
- 批量修改文件:
sed -i 's/旧域名/新域名/g' *.html # 修改所有HTML文件中的域名 - 提取特定行:
sed -n '10,20p' data.log # 输出第10-20行 - 删除空行和注释:
sed -r '/^$|^#/d' config.conf # 删除空行和以#开头的行 - 复杂替换:
sed 's/old/new/2' file.txt # 仅替换每行第二个匹配项
六、总结
- 适用场景:日志处理、配置文件修改、批量文本替换、数据分析预处理。
- 注意事项:
- 使用
-i前务必备份文件。 - 正则表达式中的特殊字符(如
/、*)需转义。 - 多命令执行时,用分号或
-e分隔命令。
- 使用
掌握sed可显著提升文本处理效率,建议通过实际案例练习巩固。
3️⃣ 参考 3
以下是关于 sed 命令的详细解析,涵盖其基本用法、核心命令、选项、高级功能及实际示例:
1. 什么是 sed?
- 全称:Stream Editor(流编辑器)。
- 功能:对文本流进行编辑,支持正则表达式,常用于文本处理、替换、删除、插入等操作。
- 特点:
- 非交互式处理,适合脚本自动化。
- 处理时将文本暂存到“模式空间”(Pattern Space)中,处理后再输出。
2. 基本语法
sed [选项] '命令' 文件
sed [选项] -f 脚本文件 文件
- 常用选项:
-n:抑制默认输出(仅打印处理后的行)。-i:直接修改原文件(可加后缀备份,如-i.bak)。-f 脚本文件:从文件中读取sed命令。-e:在命令行中执行多个命令。
3. 核心命令
(1) 替换(s 命令)
- 语法:
s/旧字符串/新字符串/标志 - 标志:
g:全局替换(替换所有匹配项,默认仅替换第一个)。p:替换后打印该行。w 文件:将替换后的行写入指定文件。
- 示例:
# 替换文件中所有出现的 "apple" 为 "banana" sed 's/apple/banana/g' file.txt # 直接修改文件并备份 sed -i.bak 's/apple/banana/g' file.txt # 替换每行最后一个匹配项 sed 's/apple/banana/\;' file.txt # 注意:此处 `\;` 表示最后一个匹配项
(2) 删除(d 命令)
- 语法:
地址 d - 示例:
# 删除第3行 sed '3d' file.txt # 删除包含 "error" 的行 sed '/error/d' file.txt # 删除第5到第10行 sed '5,10d' file.txt
(3) 打印(p 命令)
- 语法:
地址 p - 示例:
# 打印第5行(需配合 `-n`) sed -n '5p' file.txt # 打印包含 "warning" 的行 sed -n '/warning/p' file.txt
(4) 插入与追加
- 插入(
i):在指定行前插入文本。 - 追加(
a):在指定行后追加文本。 - 示例:
# 在第3行前插入 "New Line" sed '3i\New Line' file.txt # 在匹配 "start" 的行后追加 "Added Text" sed '/start/a\Added Text' file.txt
(5) 行号与模式匹配
- 行号地址:直接指定行号(如
3表示第3行)。 - 正则表达式:用
/pattern/匹配行。 - 组合地址:
start,end或/pattern1/,/pattern2/。 - 示例:
# 删除第2到第5行 sed '2,5d' file.txt # 从 "START" 到 "END" 的行全部删除 sed '/START/,/END/d' file.txt
4. 高级功能
(1) 分支与标签(b、t、:label)
- 用途:实现条件跳转或循环。
- 示例:
# 标签跳转示例 sed -e ':loop' -e '/pattern/!b end' -e 's/pattern/replacement/' -e 'b loop' -e ':end' file.txt
(2) 缓冲区操作(h、H、g、G)
- 用途:暂存和恢复文本。
- 命令:
h:将模式空间内容存入缓冲区。H:追加模式空间内容到缓冲区。g:用缓冲区内容替换模式空间。G:追加缓冲区内容到模式空间。
- 示例:
# 将当前行与下一行合并 sed -e 'N; s/\n/ /' file.txt
(3) 扩展正则表达式
- 支持:
sed支持正则表达式匹配,如^(行首)、$(行尾)、.*(任意字符)等。 - 示例:
# 删除以 "#" 开头的行 sed '/^#/d' file.txt # 替换行尾的数字 sed 's/[0-9]$//g' file.txt
5. 实际应用示例
示例1:替换字符串并修改文件
# 将文件中的 "old" 替换为 "new",并备份原文件
sed -i.bak 's/old/new/g' config.txt
示例2:删除特定行
# 删除包含 "error" 的行,并输出结果到新文件
sed '/error/d' log.txt > cleaned_log.txt
示例3:插入文本
# 在文件开头插入 "Header Line"
sed '1i\Header Line' file.txt
示例4:结合正则表达式
# 将所有以数字开头的行替换为空行
sed '/^[0-9]/s/.*/ /' data.txt
示例5:多命令组合
# 删除第5行,替换第10行的 "text" 为 "new"
sed '5d;10s/text/new/' example.txt
6. 注意事项
- 默认行为:
sed默认输出所有行,修改仅在内存中临时生效,需用-i保存。 - 特殊字符转义:若替换内容包含
/、&等,需转义或更换分隔符(如s|old|new|)。 - 多行处理:用
N命令将下一行加入模式空间,实现多行操作。
7. 总结
sed 是 Linux 下强大的文本处理工具,适用于:
- 快速替换、删除、插入文本。
- 结合正则表达式进行复杂匹配。
- 脚本自动化文本处理任务(如日志清理、配置文件修改)。
通过灵活组合命令和选项,可以高效完成各种文本编辑需求。
4️⃣ 参考 4
sed 命令详解
sed(Stream Editor,流编辑器)是 Unix/Linux 下强大的文本处理工具,用于对文本流(文件或标准输入)进行过滤和转换。它逐行读取输入,根据指定的脚本对每行数据进行处理,最终输出处理结果。
一、基本语法
sed [选项] '脚本命令' 输入文件
或
sed [选项] -f 脚本文件 输入文件
二、常用选项
| 选项 | 说明 |
|---|---|
-n | 取消默认输出(仅输出被脚本处理的行)。 |
-e | 执行指定的脚本命令(可省略,直接跟单引号脚本)。 |
-f file | 从文件中读取脚本命令。 |
-i | 直接修改输入文件(危险!建议先备份,可通过 -i.bak 生成备份)。 |
-r | 使用扩展正则表达式(默认使用基本正则表达式)。 |
-s | 分隔多个文件时,视为独立文件处理(不合并成一个流)。 |
-v | 显示版本信息。 |
三、核心工作流程
sed从输入中读取一行数据,存入模式空间(Pattern Space)。- 对模式空间中的内容应用脚本中的所有命令。
- 处理完成后,默认将模式空间的内容输出到标准输出(可通过
-n禁用)。 - 清空模式空间,读取下一行,重复上述过程。
四、常用命令(按功能分类)
1. 替换命令 s
语法:
s/旧字符串/新字符串/[修饰符]
- 修饰符:
g:全局替换(替换行中所有匹配项,而非第一个)。数字:替换第n个匹配项(如s/old/new/2替换第二个匹配项)。i:不区分大小写(仅在扩展正则中有效,或配合-r使用)。
示例:
- 替换每行第一个
apple为banana:sed 's/apple/banana/' file.txt - 全局替换所有
apple为banana:sed 's/apple/banana/g' file.txt - 替换以
http://开头的字符串为https://(正则匹配):sed 's/^http:/https:/' file.txt - 使用其他分隔符(避免转义斜杠):
sed 's#http://#https://#' file.txt # 用 # 代替 / 作为分隔符
2. 删除命令 d
语法:
地址范围d # 省略地址则匹配所有行
示例:
- 删除包含
error的行:sed '/error/d' file.txt - 删除第 5 行:
sed '5d' file.txt - 删除空行:
sed '/^$/d' file.txt # 或 sed -e '/^\s*$/d' 处理包含空格的空行
3. 插入与附加命令 i、a
i(插入):在匹配行的上方插入新行。a(附加):在匹配行的下方插入新行。
语法:
地址范围i\
新行内容
地址范围a\
新行内容
示例:
- 在包含
header的行上方插入# Start:sed '/header/i\# Start' file.txt - 在文件末尾添加一行
EOF:sed '$a\EOF' file.txt # $ 表示最后一行
4. 修改命令 c
语法:
地址范围c\
新内容
功能:将匹配行替换为指定的新内容。
示例:
- 将第 3 行替换为
new line:sed '3c\new line' file.txt
5. 打印命令 p
语法:
地址范围p
功能:打印匹配行(需配合 -n 选项避免默认输出)。
示例:
- 仅打印包含
success的行:sed -n '/success/p' file.txt - 打印第 2 到第 5 行:
sed -n '2,5p' file.txt
6. 保留空间命令 h、H、g、G
h:将模式空间内容复制到保留空间(覆盖保留空间)。H:将模式空间内容追加到保留空间。g:将保留空间内容复制到模式空间(覆盖模式空间)。G:将保留空间内容追加到模式空间。
示例:交换两行内容(需配合地址范围):
sed -n '1h; 2G; p' file.txt # 第1行存入保留空间,第2行追加保留空间内容并打印
7. 其他实用命令
=: 打印行号。sed '=' file.txt # 输出每行内容及其行号(行号先于内容)q: 退出sed(遇到匹配行时终止处理)。sed '/target/q' file.txt # 遇到包含target的行时停止处理s///简写:替换为空(删除匹配内容)。sed 's/old//' file.txt # 删除第一个old sed 's/old//g' file.txt # 删除所有old
五、地址范围
sed 命令可针对特定行或匹配模式的行执行,地址范围语法如下:
| 语法 | 说明 |
|---|---|
n | 第 n 行(如 5 表示第5行)。 |
n,m | 第 n 行到第 m 行(如 2,10)。 |
/pattern/ | 匹配包含 pattern 的行(如 /error/)。 |
/pattern1/,/pattern2/ | 从匹配 pattern1 的行到匹配 pattern2 的行(包含这两行)。 |
$ | 最后一行。 |
0 | 不匹配任何行(无意义)。 |
示例:
- 对第 3 到第 5 行执行删除:
sed '3,5d' file.txt - 对包含
start到包含end的行之间的内容执行替换:sed '/start/,/end/s/old/new/g' file.txt
六、正则表达式注意事项
-
基本正则 vs 扩展正则:
- 默认使用基本正则表达式(BRE),特殊字符需转义(如
\.表示点号,\( \)表示分组)。 - 使用
-r选项启用扩展正则表达式(ERE),无需转义部分字符(如\.可写成\.或\.,()直接分组)。
- 默认使用基本正则表达式(BRE),特殊字符需转义(如
-
常用正则符号:
^:行首,$:行尾。.*:匹配任意字符(除换行符)零次或多次。[abc]:匹配a、b、c中的任意一个。\(text\)(BRE)或(text)(ERE):分组,可通过\1引用第一个分组。
示例(分组引用):
- 交换
a=123 b=456中的值:sed 's/\(a=\)\(.*\) \(b=\)\(.*\)/\3\4 \1\2/' # 基本正则,需转义括号 sed -r 's/(a=)(.*) (b=)(.*)/\3\4 \1\2/' # 扩展正则,无需转义括号
七、典型应用场景
- 替换文件中的字符串(谨慎使用
-i):sed -i 's/old_string/new_string/g' file.txt - 删除注释或空行:
sed -e '/^#/d' -e '/^$/d' config.conf # 删除以#开头的注释行和空行 - 提取日志中的特定信息:
logfile | sed -n '/ERROR/p' # 仅输出包含ERROR的行 - 修改配置文件:
sed -i '/^user=/c\user=admin' config.ini # 修改user配置项 - 处理 CSV/日志格式:
sed 's/,/ /g' data.csv # 将逗号替换为空格
八、注意事项
- 备份文件:使用
-i前务必确认,或通过-i.bak生成备份:sed -i.bak 's/old/new/g' file.txt # 生成file.txt.bak备份 - 特殊字符转义:在替换内容中若包含
$、/、&等字符,需用\转义,或使用其他分隔符(如#)。 - 多行处理:sed 默认逐行处理,若需处理多行,可结合
N(将下一行追加到模式空间)、D(删除模式空间中直到第一个换行符的内容)等命令,但逻辑较复杂,建议改用awk或perl。
九、总结
sed 是文本处理的瑞士军刀,核心在于灵活运用地址范围和替换/删除/插入等命令,结合正则表达式实现高效的文本转换。掌握基础命令后,通过实践可应对复杂场景(如日志清洗、配置文件修改等)。建议先通过 man sed 查阅完整文档,或使用在线工具(如 RegExr)调试正则表达式。
5️⃣ 参考 5
sed 是流编辑器(Stream Editor)的简称,是一种强大的文本处理工具,能在 Linux 系统中对文本进行各种操作,如替换、删除、插入等。以下是对它的详细讲解:
基本语法
sed [选项]... {script}... [输入文件]...sed [选项]... --file=scriptfile [输入文件]...
其中,选项常见的有:
-e script:表示使用脚本script来处理输入的文件。-f scriptfile:表示使用脚本文件scriptfile中的指令来处理输入的文件。-n:只打印脚本处理后的结果,否则sed会默认输出所有行。-i:直接修改文件内容,而不是输出到终端。
常见命令及操作
- 替换(s) :格式为
s/查找内容/替换内容/选项。例如,将文件中所有的 “apple” 替换为 “banana”,可以使用sed 's/apple/banana/g' filename。“g” 表示全局替换,如果不加 “g”,则每行只替换第一个匹配的 “apple”。 - 删除(d) :用于删除指定的行。例如,删除文件的第 3 行,使用
sed '3d' filename;删除文件中包含 “error” 的行,使用sed '/error/d' filename。 - 插入(i 和 a) :
i表示在指定行之前插入,a表示在指定行之后插入。例如,在文件的第 2 行之前插入 “hello world”,使用sed '2i hello world' filename;在文件的第 4 行之后插入 “test”,使用sed '4a test' filename。 - 打印(p) :用于打印指定的行。例如,打印文件的第 5 行,使用
sed -n '5p' filename;打印文件中包含 “success” 的行,使用sed -n '/success/p' filename。
地址范围
地址范围可以指定要进行操作的行范围,格式为 [地址范围]操作 。例如:
sed '1,5d' filename:删除文件的第 1 到第 5 行。sed '/start/,/end/s/old/new/g' filename:从包含 “start” 的行到包含 “end” 的行之间,将所有的 “old” 替换为 “new”。
其他功能
-
多行操作 :可以用
\将命令分多行书写,提高可读性。例如:- `sed -e '1,5d' \
-e '/error/d' filename`
-
脚本文件 :可以将多个
sed命令写入一个脚本文件,然后使用-f选项来执行。例如,创建一个脚本文件script.sed,内容为:1,5d/error/d
然后使用 sed -f script.sed filename 来执行。
- 结合其他命令 :可以和其他命令结合使用,如
grep、awk等,实现更复杂的数据处理。例如,先用grep找出包含 “info” 的行,再用sed替换其中的某些内容:grep 'info' filename | sed 's/old/new/g'
6️⃣ 参考 6
sed(全称:stream editor,即流编辑器)是一种在Unix、Linux和其他类Unix系统中常用的命令行文本处理工具。它可以对文本文件进行查找、替换、删除和插入等操作,非常适合用于批量文本处理任务。
基本语法
sed [选项] '命令' 输入文件
常用选项
-n:禁止自动打印模式空间,只有当命令明确要求输出时才打印。-e:允许在命令行上添加多个编辑命令。-f:从指定的文件中读取编辑命令。-i:直接修改输入文件,而不是将结果输出到标准输出。
常用命令
p:打印当前模式空间的内容。d:删除当前模式空间的内容。s/old/new/:将当前模式空间中的“old”字符串替换为“new”字符串。i\:在当前行之前插入文本。a\:在当前行之后追加文本。c\:将选定的行改为新的指定的文本。y/old/new/:将当前模式空间中的字符“old”替换为“new”。
示例
- 打印文件中的所有行:
sed '' 文件名
- 打印文件中的第2行:
sed -n '2p' 文件名
- 删除文件中的第2行:
sed '2d' 文件名
- 将文件中的所有“old”替换为“new”:
sed 's/old/new/g' 文件名
- 在文件中的每行前面添加“prefix-”:
sed 's/^/prefix-/' 文件名
- 直接修改文件,将所有“old”替换为“new”:
sed -i 's/old/new/g' 文件名
这只是sed命令的一些基本用法,实际上sed的功能非常强大,可以通过组合多个命令和选项来完成更复杂的文本处理任务。
sed命令详解
sed(Stream Editor)是Linux/Unix系统中用于文本处理的流式编辑器,支持对文本进行查找、替换、删除、插入等操作[^1^][^2^][^6^]。以下是其核心功能和用法的详细解析:
一、基本语法
sed [选项] '命令' [输入文件]
- 选项:控制
sed的行为(如直接修改文件、多命令执行等)。 - 命令:指定操作类型(如替换、删除、插入等)。
- 输入文件:可选,若省略则从标准输入读取数据[^4^][^6^]。
二、常用选项
| 选项 | 作用 |
|---|---|
-i | 直接修改原文件(而非输出到终端)[^2^][^5^]。 |
-e | 执行多个命令(可重复使用),例如 -e 's/old/new/' -e 'd'[^2^][^6^]。 |
-n | 禁止默认输出,仅显示经过处理的行(需配合p命令使用)[^4^][^6^]。 |
三、核心命令与操作
-
替换(Substitution)
语法:s/模式/替换内容/- 将匹配“模式”的文本替换为“替换内容”。
- 示例:将文件
file.txt中的foo替换为bar:sed 's/foo/bar/g' file.txt # `g`表示全局替换[^2^][^5^]
-
删除(Delete)
语法:d- 删除当前行。
- 示例:删除第3行:
sed '3d' file.txt # 或指定行范围,如`3,5d`删除3-5行[^3^][^5^]
-
插入(Insert)
语法:i\后接内容- 在当前行上方插入内容。
- 示例:在第2行前插入
New Line:sed '2i\New Line' file.txt # 使用`a\`表示在行下方插入[^3^][^5^]
-
打印(Print)
语法:p- 输出缓冲区中的文本。常与
-n选项配合使用。 - 示例:仅打印包含
error的行:sed -n '/error/p' file.txt # `/pattern/p`表示匹配行才打印[^4^][^6^]
- 输出缓冲区中的文本。常与
-
定界符与多命令
- 若命令中包含
/,可通过更改定界符避免冲突,例如s:/old/:/new/:g。 - 多命令用
-e或分号分隔,例如:sed -e 's/foo/bar/' -e '3d' file.txt # 先替换,再删除第3行[^2^][^6^]
- 若命令中包含
四、高级功能
-
正则表达式支持
sed支持基础正则表达式,例如^(行首)、$(行尾)、.(任意字符)等。- 示例:删除空行:
sed '/^$/d' file.txt # 匹配空行并删除[^3^][^5^]
-
分组与引用
- 使用
\1,\2等引用括号分组内容。 - 示例:将
Chapter 1改为Section 1:sed 's/\(Chapter \)[0-9]+\1/Section \1/' file.txt # 替换分组内容[^5^]
- 使用
-
脚本文件与复杂操作
- 将多条命令写入脚本文件(如
commands.sed),通过sed -f commands.sed file.txt执行。 - 示例:批量替换多个单词:
s/foo/bar/g s/test/demo/g
- 将多条命令写入脚本文件(如
五、应用场景
-
批量文本处理
- 快速修改配置文件、日志文件或代码中的特定内容[^1^][^4^]。
- 示例:批量替换代码中的变量名:
sed -i 's/oldVar/newVar/g' *.c # 修改所有`.c`文件中的变量名[^2^][^5^]
-
数据清洗
- 删除多余空行、提取特定字段或格式化文本[^3^][^6^]。
-
脚本自动化
- 结合Shell脚本实现复杂文本处理流程,例如日志分析或数据预处理[^5^]。
六、注意事项
- 备份原文件
- 使用
-i选项时,建议先备份文件(如cp file.txt file.bak),避免误操作[^4^]。
- 使用
- 区分
sed与awksed擅长简单文本替换和删除,而awk更适合基于条件的复杂文本处理[^1^][^6^]。
- 性能优化
- 对大文件处理时,优先使用流式处理(如
sed 's/pattern/replace/g' largefile),避免加载整个文件到内存[^4^]。
- 对大文件处理时,优先使用流式处理(如
通过灵活组合选项和命令,sed可高效解决多种文本处理需求。更多细节可参考man sed或查看具体系统的帮助文档[^3^][^6^]。
7️⃣ 参考 7
sed命令详解与使用指南
sed(Stream Editor)是Linux/Unix系统中的流式文本编辑器,通过模式匹配+文本操作实现非交互式文本处理。其核心优势在于逐行处理能力和正则表达式支持。
一、基础语法结构
sed [选项] '操作指令' 输入文件
典型示例:
sed 's/foo/bar/g' file.txt # 全局替换foo为bar
sed -i.bak '3d' config.cfg # 删除第3行并创建备份文件
二、核心功能模块
-
常用选项(OPTIONS)
选项 功能说明 -n抑制默认输出,常与 p命令配合使用-i[SUFFIX]直接修改源文件(谨慎使用),可选备份后缀 -r启用扩展正则表达式 -e执行多条命令,如 sed -e 's/a/b/' -e '3d' -
核心命令(COMMANDS)
命令 格式示例 功能 替换 `s/pattern/replacement/[g p ...]` 文本替换, g表示全局替换删除 d删除匹配行,如 sed '/error/d' log.txt打印 p输出指定内容,需配合 -n选项追加 a\text在匹配行后追加文本 插入 i\text在匹配行前插入文本 -
地址匹配规则
sed '3s/old/new/' file # 仅在第3行替换 sed '/start/,/end/d' file # 删除start到end之间的所有行 sed '5,$p' file # 打印第5行到末尾
三、高级应用技巧
- 多命令组合
sed -e 's/foo/bar/; 5d' file.txt # 替换后删除第5行 - 正则表达式扩展
sed -r 's/(\d+)-(\d+)/\2:\1/' phone.txt # 用分组重组电话号码 - 脚本文件调用
sed -f script.sed input.txt # 调用预存命令脚本
四、安全操作建议
- 测试命令时先省略
-i选项,确认无误后再执行真实修改 - 使用
-i.bak创建备份文件,防止误操作 - 复杂正则表达式建议先用
echo | sed验证
五、典型应用场景
- 日志清洗:
sed '/ERROR/d; s/DEBUG/INFO/' app.log - 配置文件修改:
sed -i '/^#Port/s/#Port/Port/' sshd_config - 数据格式转换:
sed 's/\(.*\)/\U\1/' names.txt(转大写)
8️⃣ 参考 8
sed(Stream Editor)是Linux/Unix系统中强大的流式文本处理工具,支持非交互式的批量编辑操作。以下从核心功能、语法结构、实战案例等方面进行详解:
一、核心功能与原理
-
流式处理机制
sed逐行读取输入(文件或标准输入流),将当前行存入模式空间(Pattern Space),按脚本命令处理后输出,再清空缓冲区进入下一循环。默认不修改原文件,仅输出到终端,需通过-i选项直接编辑文件。 -
主要功能
• 替换文本:如批量修改字符串• 删除/插入行:根据行号或正则匹配操作
• 过滤与提取:打印特定行或匹配内容
• 复杂脚本处理:支持分支、循环等高级操作
二、基础语法与常用命令
sed [选项] '操作指令' 输入文件
常用选项
| 选项 | 说明 |
|---|---|
-n | 禁止默认输出,常与p命令配合显示指定内容 |
-e | 执行多条命令(例:sed -e 's/a/b/' -e 'd') |
-i | 直接修改原文件(危险操作,建议备份) |
-r | 启用扩展正则表达式 |
核心操作指令
| 命令 | 功能 | 示例 |
|---|---|---|
s/replace/new/ | 替换首个匹配内容 | sed 's/old/new/g'(全局替换) |
d | 删除行 | sed '3d'(删第3行) |
a\text | 行后追加文本 | sed '/pattern/a\new line' |
i\text | 行前插入文本 | sed '2i\header'(第2行前插入) |
p | 打印内容 | sed -n '1,5p'(仅显示1-5行) |
三、地址定位与正则表达式
-
地址范围
• 行号:3,5(第3到5行)• 正则匹配:
/^start/,/end$/(匹配以start开头到end结尾的行)• 特殊符号:
$表示末行,1~2表示从第1行开始每隔2行处理 -
正则元字符
符号 含义 ^行首锚定(例: /^#/匹配注释行)$行尾锚定(例: /txt$/匹配以txt结尾的行).*任意字符(贪婪匹配) \<单词开头(例: /\<word匹配以word开头的单词)
四、实战案例
-
批量替换域名
sed -i 's/www.old.com/www.new.com/g' *.conf # 替换所有.conf文件中的旧域名 -
删除注释行与空行
sed -i '/^#/d; /^$/d' script.sh # 删除以#开头的行和空行 -
插入版权信息
sed '1i\/* Copyright 2025 */' code.c # 在文件首行插入版权声明 -
提取特定范围内容
sed -n '/START/,/END/p' data.log # 打印START到END之间的内容
五、高级技巧
-
多点编辑
使用-e执行多个命令,或分号分隔:sed -e '1,5d' -e 's/error/warning/' log.txt # 先删除1-5行,再替换error -
引用匹配内容
在替换中使用&引用匹配项,或\1引用分组:sed 's/[0-9]/&th/g' # 将数字后加th(如2→2th) sed 's/\(love\)able/\1rs/' # loveable→lovers -
模式空间与保持空间
通过h(复制到缓冲区)、G(追加到模式空间)实现跨行操作。
总结 sed通过简洁的脚本语法实现高效文本处理,尤其适合自动化场景。掌握基础命令后,可结合正则表达式和地址定位处理复杂需求。更高级的标签跳转、条件分支等功能可参考官方文档或进阶教程。
9️⃣ 参考 9
sed(Stream Editor)是一个强大的文本处理工具,广泛用于在类Unix操作系统中进行文本替换、删除、插入和搜索等操作。以下是sed命令的详细解释:
基本语法
sed [选项] '命令' 文件
常用选项
-n:抑制自动打印模式空间内容,通常与p命令一起使用以仅输出特定行。-e:指定要执行的命令,可以多次使用。-f:从文件中读取sed命令。-i:直接修改文件内容(就地编辑)。
基本命令
-
替换(Substitution)
sed 's/模式/替换内容/' 文件s:表示替换操作。/模式/:要匹配的模式。/替换内容/:用于替换的内容。- 默认情况下,
sed只替换每行中第一次匹配的内容。
示例:将每行中的
foo替换为bar。sed 's/foo/bar/' 文件 -
删除(Delete)
sed 'Nd' 文件N:要删除的行号。d:删除命令。
示例:删除第3行。
sed '3d' 文件 -
插入和追加(Insert & Append)
- 插入(Insert):在指定行之前插入内容。
sed 'Ni\新内容' 文件i\:插入命令。
- 追加(Append):在指定行之后追加内容。
sed 'Na\新内容' 文件a\:追加命令。
示例:在第2行之前插入
新行。sed '2i\新行' 文件 - 插入(Insert):在指定行之前插入内容。
-
打印特定行(Print)
sed -n 'Np' 文件-n:抑制自动打印。p:打印命令。
示例:仅打印第5行。
sed -n '5p' 文件 -
范围操作(Range)
sed '起始行,结束行命令' 文件示例:替换第2到第4行中的
foo为bar。sed '2,4s/foo/bar/' 文件 -
多命令执行
使用
-e选项可以在一行中执行多个sed命令。示例:先删除第1行,然后在第3行插入
新行。sed -e '1d' -e '3i\新行' 文件
高级用法
-
使用正则表达式
sed支持使用正则表达式进行复杂的模式匹配和替换。示例:删除所有以
#开头的行。sed '/^#/d' 文件 -
保持和交换(Hold and Exchange)
sed提供了保持空间(hold space)和模式空间(pattern space)的交换操作,用于更复杂的文本处理。示例:交换每两行。
sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' 文件 -
使用变量
可以结合Shell变量进行动态替换。
示例:将
foo替换为变量VAR的值。VAR="bar" sed "s/foo/$VAR/" 文件
常用示例
-
替换文件中所有
old为new并保存结果到新文件sed 's/old/new/g' 文件 > 新文件 -
删除空行
sed '/^$/d' 文件 -
在文件末尾追加内容
sed '$a\追加的内容' 文件 -
在匹配行之前插入内容
sed '/匹配模式/i\插入的内容' 文件 -
将替换结果直接应用于文件(谨慎使用)
sed -i 's/old/new/g' 文件
注意事项
-
备份文件:在使用
-i选项进行就地编辑时,建议使用备份选项以防止数据丢失。sed -i.bak 's/old/new/g' 文件这将在修改文件之前创建一个名为
文件.bak的备份。 -
转义字符:在使用特殊字符(如
/、&等)时,需要进行适当的转义。sed 's/\/old\//\/new\//g' 文件 -
性能考虑:对于非常大的文件,
sed可能会消耗较多内存和处理时间,需根据实际情况选择合适的工具。
总结
sed是一个功能强大的文本处理工具,适用于各种文本替换、删除、插入和搜索任务。掌握其基本命令和高级用法,可以极大地提高文本处理的效率和效果。建议通过实际练习和阅读更多资料来深入理解sed的使用方法。
🔟 参考 10
以下是关于 sed 命令的详细解析,结合其核心功能、语法及实战应用场景整理而成:
一、sed 基础概念
sed(Stream Editor)是 Linux/Unix 系统中强大的流编辑器,用于对文本流进行非交互式编辑。其核心流程为:
- 读取一行到模式空间(Pattern Space);
- 执行命令(如替换、删除、插入等);
- 输出结果(默认打印修改后的行);
- 循环处理下一行,直至文件末尾。
二、基本语法
sed [选项] '命令' 输入文件
- 常用选项:
-n:禁止默认输出,仅显示处理后的行。-e:允许多条命令执行(命令顺序影响结果)。-i:直接修改原文件(慎用,建议备份:-i.bak)。-r:支持扩展正则表达式。
三、核心命令与操作
1. 地址范围
- 单行:
1(第1行)、$(最后一行)。 - 行区间:
1,5(第1-5行)、5,$(第5行到最后)。 - 正则匹配:
/pattern/(匹配含pattern的行)、\cpatternc(转义字符匹配)。
2. 常用命令
| 命令 | 功能 | 示例 |
|---|---|---|
| s | 替换文本 | s/old/new/g(全局替换) |
| d | 删除行 | /pattern/d(删除含 pattern 的行) |
| *i* | 插入文本 | /pattern/i\插入内容(匹配行前插入) |
| *a* | 追加文本 | /pattern/a\追加内容(匹配行后追加) |
| p | 打印行 | -n '/pattern/p'(仅打印匹配行) |
| *c* | 替换整行 | 2,5c\新内容(替换第2-5行为新内容) |
3. 高级命令
- 保持与获取缓冲区:
h:将当前行复制到保持缓冲区。H:追加到保持缓冲区。g:用保持缓冲区内容覆盖模式空间。G:追加保持缓冲区内容到模式空间。
- 分支命令:
b label:跳转到标签处执行。t label:条件满足时跳转。
四、替换操作详解
1. 基本替换
sed 's/apple/orange/g' file.txt # 全局替换所有 "apple" 为 "orange"
- 标志:
g:全局替换(默认仅替换每行第一个匹配项)。p:打印替换后的行(常与-n配合)。w file:将结果写入文件。
2. 特殊替换
- 引用匹配内容:
s/\(pattern\)/\1/g:用捕获组内容替换(如s/\(love\)/\1able/g→lovable)。&:在替换文本中引用完整匹配项(如s/foo/&bar/g→foobar)。
- 字符转换:
y/abc/XYZ/:逐字符替换(a→X,b→Y,c→Z)。
五、实战应用案例
1. 批量替换
sed -i 's/www.old.com/www.new.com/g' *.html # 批量替换所有 HTML 文件中的域名
2. 删除注释行
sed '/^#/d' config.sh # 删除以 # 开头的注释行
3. 添加版权信息
sed -i '1i\/*\n * Copyright 2024 *\n */' *.c # 在所有 C 文件开头插入版权声明
4. 提取特定列
sed -n '2p' data.txt # 打印第2行
sed -n '/start/,/end/p' file # 打印 start 到 end 之间的行
六、选项与注意事项
- 直接修改文件:使用
-i选项时,建议备份原文件(如sed -i.bak 's/old/new/g' file)。 - 正则表达式:默认使用基础正则,需用
-r启用扩展正则(如+、?等元字符)。 - 性能优化:处理大文件时,可结合
--unbuffered(-u)选项减少内存占用。
七、总结
sed 通过流式处理和脚本化操作,成为文本处理的利器。掌握其核心命令(如 s、d、i)和地址范围控制,可高效完成日志过滤、配置修改等任务。对于复杂需求,可结合分支、保持缓冲区等高级功能编写脚本。