sed (Stream Editor) 是 Linux/Unix 系统中强大的流式文本编辑器,用于对输入流(文件或管道)进行基本的文本转换。以下是 sed 命令的全面指南:
sed [选项] '命令' 输入文件
或通过管道:
cat 文件 | sed [选项] '命令'
选项 | 说明 |
---|---|
-n |
禁止默认输出,只打印处理过的行 |
-e |
添加脚本到命令执行 |
-f |
添加脚本文件到命令执行 |
-i |
直接修改文件内容 |
-r |
使用扩展正则表达式 |
sed 's/原字符串/新字符串/' 文件
示例:
sed 's/foo/bar/' file.txt # 将每行第一个foo替换为bar
sed 's/foo/bar/g' file.txt # 全局替换
sed 's/foo/bar/2' file.txt # 只替换每行第二个foo
sed 'Nd' 文件 # 删除第N行
sed 'N,Md' 文件 # 删除N到M行
sed '/pattern/d' 文件 # 删除匹配pattern的行
示例:
sed '5d' file.txt # 删除第5行
sed '2,4d' file.txt # 删除2-4行
sed '/^#/d' file.txt # 删除所有注释行(以#开头)
sed -n 'Np' 文件 # 打印第N行
sed -n 'N,Mp' 文件 # 打印N到M行
sed -n '/pattern/p' 文件 # 打印匹配pattern的行
示例:
sed -n '10p' file.txt # 打印第10行
sed -n '5,8p' file.txt # 打印5-8行
sed -n '/error/p' log.txt # 打印包含error的行
sed 'Ni\插入内容' 文件 # 在第N行前插入
sed 'Na\追加内容' 文件 # 在第N行后追加
示例:
sed '3i\插入的行' file.txt # 在第3行前插入
sed '$a\最后一行后追加' file.txt # 在文件末尾追加
sed 'Nc\新内容' 文件 # 替换第N行
示例:
sed '5c\这是新的第5行' file.txt
sed -e 's/foo/bar/' -e 's/baz/qux/' file.txt
或使用分号分隔:
sed 's/foo/bar/; s/baz/qux/' file.txt
sed -r 's/[0-9]{3}/***/g' file.txt # 替换所有3位数字为***
sed 's/\(foo\) bar/\1 baz/' file.txt # 将"foo bar"替换为"foo baz"
sed -r 's/(foo) bar/\1 baz/' file.txt # 使用扩展正则表达式
sed -i 's/foo/bar/g' file.txt # 直接修改文件
sed -i.bak 's/foo/bar/g' file.txt # 修改前备份原文件为file.txt.bak
sed '/start/,/end/d' file.txt # 删除从包含start到包含end的所有行
sed '10,20s/foo/bar/g' file.txt # 只在10-20行替换
sed '/^$/d' file.txt
sed 's/^/# /' file.txt
sed 's/\r$//' dosfile.txt > unixfile.txt
sed -n '/2023-01-01 10:00:00/,/2023-01-01 11:00:00/p' logfile.txt
sed '1!G;h;$!d' file.txt
-i
选项会直接修改文件,建议先测试命令或备份文件-r
选项启用扩展正则表达式掌握这些sed技巧可以大大提高文本处理的效率,特别是在处理日志文件、配置文件批量修改等场景中非常有用。