ed是一个行文本编辑器,最初出现在Unix系统中。它是一个面向行的编辑器,使用简单的命令来操作文本。虽然现代编辑器如vim和nano更为流行,但ed在脚本编程、批处理编辑和受限环境中仍然有其用途。
ed [选项] [文件]
| 选项 | 说明 |
|---|---|
| -p string | 设置命令提示符 |
| -s | 静默模式,抑制诊断输出 |
| -v | 详细模式 |
| -G | 使用传统(兼容)模式 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
| 命令 | 说明 |
|---|---|
| a | 进入追加模式,在当前行后添加文本 |
| i | 进入插入模式,在当前行前插入文本 |
| c | 修改当前行 |
| d | 删除当前行 |
| p | 打印当前行 |
| n | 打印带行号的当前行 |
| w | 写入文件 |
| q | 退出编辑器 |
| Q | 强制退出(不保存) |
| s/old/new/ | 替换文本 |
| /pattern/ | 搜索模式 |
| . | 单独的点表示退出输入模式 |
ed使用地址来指定要操作的行:
. 当前行
$ 最后一行
n 第n行
+n 当前行后的第n行
-n 当前行前的第n行
, 所有行(1,$)
; 从当前行到最后一行(.,$)
/regex/ 匹配正则表达式的行
创建一个新文件并进行基本编辑:
# 启动ed编辑器
ed
# 进入输入模式
a
这是第一行。
这是第二行。
这是第三行。
. # 退出输入模式
# 显示所有内容
1,$p
# 保存文件
w test.txt
# 退出
q
打开并编辑现有文件:
# 创建测试文件
echo -e "第一行\n第二行\n第三行" > example.txt
# 使用ed编辑文件
ed example.txt
# 在ed中的操作:
# 显示内容
1,$p
# 删除第二行
2d
# 显示修改后的内容
1,$p
# 保存并退出
w
q
使用搜索和替换功能:
# 创建包含特定文本的文件
echo -e "hello world\nhello linux\nhello editor" > text.txt
# 使用ed进行替换
ed text.txt << 'EOF'
1,$s/hello/hi/g # 全局替换hello为hi
1,$p # 显示结果
w # 保存
q
EOF
# 查看修改后的文件
cat text.txt
进行各种行操作:
# 创建测试文件
seq 1 5 > numbers.txt
# 使用ed进行行操作
ed numbers.txt << 'EOF'
3i # 在第3行前插入
3.5 # 插入的内容
. # 退出插入模式
5d # 删除第5行
1,2c # 修改第1-2行
一
二
. # 退出修改模式
1,$p # 显示所有行
w # 保存
q
EOF
cat numbers.txt
使用地址范围进行批量操作:
# 创建多行文件
echo -e "aaa\nbbb\nccc\nddd\neee" > data.txt
# 使用地址范围
ed data.txt << 'EOF'
2,4p # 显示第2-4行
2,4s/b|x|d/X/g # 在第2-4行中替换b,c,d为X
1,$p # 显示所有行
w
q
EOF
cat data.txt
在Shell脚本中使用ed进行批处理:
#!/bin/bash
# 使用ed批量修改配置文件
update_config() {
local config_file=$1
local key=$2
local value=$3
ed -s "$config_file" << EOF
/^$key=/d
a
$key=$value
.
w
q
EOF
}
# 创建示例配置文件
echo -e "HOST=localhost\nPORT=8080\nDEBUG=false" > app.conf
# 修改配置
update_config "app.conf" "PORT" "9090"
update_config "app.conf" "DEBUG" "true"
echo "修改后的配置:"
cat app.conf
在部署脚本中自动修改配置文件:
#!/bin/bash
# 自动更新多个配置文件
update_configurations() {
echo "开始更新配置文件..."
# 更新nginx配置
if [ -f "/etc/nginx/nginx.conf" ]; then
ed -s "/etc/nginx/nginx.conf" << 'EOF'
/worker_processes/
s/worker_processes.*/worker_processes 4;/
w
q
EOF
echo "nginx配置已更新"
fi
# 更新系统限制
if [ -f "/etc/security/limits.conf" ]; then
ed -s "/etc/security/limits.conf" << 'EOF'
$a
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
.
w
q
EOF
echo "系统限制已更新"
fi
}
update_configurations
使用ed处理和分析日志文件:
#!/bin/bash
# 清理和格式化日志文件
process_log_file() {
local log_file=$1
local output_file=$2
echo "处理日志文件: $log_file"
# 使用ed清理日志
ed -s "$log_file" << 'EOF'
1,$g/^$/d # 删除所有空行
1,$g/^#/d # 删除所有注释行
1,$s/ \+/ /g # 将多个空格替换为单个空格
1,10p # 显示前10行(预览)
w "$output_file" # 保存到输出文件
q
EOF
echo "处理完成: $output_file"
echo "行数: $(wc -l < "$output_file")"
}
# 使用函数
process_log_file "raw.log" "cleaned.log"
将文本从一种格式转换为另一种格式:
#!/bin/bash
# 将CSV格式转换为固定宽度格式
convert_csv_to_fixed() {
local input_file=$1
local output_file=$2
echo "转换CSV到固定宽度格式..."
# 使用ed进行转换
ed -s "$input_file" << 'EOF'
1,$s/,/ | /g # 将逗号替换为管道符号
1,$s/^/| / # 在行首添加管道符号
1,$s/$/ |/ # 在行尾添加管道符号
1i # 插入表头分隔线
|------|------|------|
.
w "$output_file"
q
EOF
echo "转换完成: $output_file"
}
# 创建示例CSV文件
echo -e "Name,Age,City\nAlice,25,Beijing\nBob,30,Shanghai" > data.csv
# 执行转换
convert_csv_to_fixed "data.csv" "table.txt"
cat table.txt
使用g命令进行全局操作:
# 创建测试文件
echo -e "error: file not found\nwarning: deprecated\ninfo: started\nerror: permission denied" > messages.txt
# 使用全局命令
ed messages.txt << 'EOF'
g/^error/p # 打印所有以error开头的行
g/^error/d # 删除所有以error开头的行
1,$p # 显示剩余内容
w
q
EOF
使用标记来记住位置:
# 创建多章节文件
echo -e "Chapter 1\nContent A\nContent B\nChapter 2\nContent C" > book.txt
# 使用标记导航
ed book.txt << 'EOF'
/Chapter 1/ # 搜索到第一章
ka # 标记当前位置为a
/Chapter 2/ # 搜索到第二章
'a,$p # 从标记a到文件末尾打印
'a,'a+2p # 打印标记a后的2行
q
EOF
使用高级替换功能:
# 创建包含各种格式的文件
echo -e "Name: John Doe\nAge: 30\nEmail: john@example.com" > contact.txt
# 使用分组和反向引用
ed contact.txt << 'EOF'
1,$s/\(Name\): \(.*\)/\2 (\1)/ # 重新格式化Name行
1,$s/\(.*\): \(.*\)/[\1] = "\2"/ # 添加方括号和引号
1,$p
w
q
EOF
cat contact.txt
.来退出输入模式w命令保存,否则更改会丢失Q命令可以强制退出而不保存-s选项抑制输出使用-p选项设置提示符:
# 设置提示符
ed -p "ed> " filename
# 或者在ed内部设置提示符
ed filename
P # 开启提示符
*ed> # 现在会显示提示符
在单独一行输入点号.退出输入模式:
# 正确退出输入模式的方法
a # 进入追加模式
这是输入的文字
. # 单独一行输入点号,退出输入模式
# 如果卡在输入模式,可以按Ctrl+C中断
# 或者按Ctrl+D(但可能退出编辑器)
检查正则表达式和分隔符:
# 基本的替换语法
s/old/new/ # 替换当前行的第一个old为new
s/old/new/g # 替换当前行的所有old为new
# 使用不同的分隔符(当文本包含/时很有用)
s|old|new|g # 使用|作为分隔符
s#old#new#g # 使用#作为分隔符
# 确认替换范围
1,$s/old/new/g # 在整个文件中替换
| 命令 | 说明 | 区别 |
|---|---|---|
| sed | 流编辑器 | 非交互式,适合管道操作 |
| vim | 改进的vi编辑器 | 全屏编辑器,功能更丰富 |
| nano | 简单易用的编辑器 | 更适合初学者 |
| ex | 行编辑器 | ed的扩展版本 |
| awk | 文本处理语言 | 更适合复杂的数据处理 |
ed编辑器在Unix历史中具有重要地位,它是许多后续编辑器(如ex、vi、vim)的基础。虽然现在很少直接使用ed进行交互式编辑,但了解ed对于理解Unix哲学和文本处理工具的发展很有帮助。