sed命令笔记250419
sed
(Stream Editor)是 Linux/Unix 系统中强大的流编辑器,主要用于对文本进行过滤和转换(按行处理)。它支持正则表达式,适合处理文本替换、删除、插入等操作。以下是 sed
的详细解析:
一、基本语法
sed [选项] '命令' 输入文件
sed [选项] -f 脚本文件 输入文件 # 从脚本文件读取命令
二、常见选项
选项 | 说明 |
---|---|
-n | 静默模式,仅输出处理后的行(常与 p 命令搭配) |
-e | 指定多个命令,如 sed -e '命令1' -e '命令2' |
-i | 直接修改文件内容(慎用,建议先备份)-i.bak 修改前备份原文件为 .bak |
-E , -r, --regexp-extended | 使用扩展正则表达式(如 + , | , () 等) |
-f | 从指定文件中读取命令 |
三、编辑命令(核心)
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
不支持(?:)
语法,所有()
均为捕获分组。
用sed替换文本 笔记250419
sed的分组替换,捕获组,反向引用 笔记250419
2. 特殊字符转义
若替换内容包含 /
,可更换分隔符(如 s|/old|/new|
)。
3. 动态替换
使用 &
引用匹配的整个内容:
echo "123" | sed 's/[0-9]\+/数字:&/' # 输出 数字:123
分组详解
sed的分组替换,捕获组,反向引用 笔记250419
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
用sed替换文本 笔记250419
sed的分组替换,捕获组,反向引用 笔记250419
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
)。 -
性能:复杂分组可能降低处理速度,尤其在大型文件中。
用sed替换文本 笔记250419
sed的分组替换,捕获组,反向引用 笔记250419
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
与awk
sed
擅长简单文本替换和删除,而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 删除 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\新行' 文件
-
-
打印特定行(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
)和地址范围控制,可高效完成日志过滤、配置修改等任务。对于复杂需求,可结合分支、保持缓冲区等高级功能编写脚本。