sed 是 Unix 和 Linux 系统中的一个强大的流编辑器。它用于对文本进行基本的修改和处理。以下是关于 sed 的详细解说,包括其基本语法,常见用法和一些高级用法。
基本语法
sed [选项] '命令' 输入文件
常见选项
- -e:指定要执行的- sed命令。
- -f:指定包含- sed命令的脚本文件。
- -i:直接修改文件内容(小心使用)。
- -n:取消默认输出,适合与- p命令一起使用来控制输出。
- -r:使用扩展正则表达式。
- -s:将输入文件视为独立的文件,而不是一个长的流。
常用命令
- s: 替换
- p: 打印
- d: 删除
- a: 追加文本在当前行后
- i: 插入文本在当前行前
- c: 替换行
- q: 退出
- y: 转换字符
基本命令
 -n 可以抑制默认输出,只输出第2行:
    sed -n '2p' file.txt
搜索和替换
- 基本替换语法:sed 's/原文本/新文本/' 输入文件
echo "hello world" | sed 's/world/universe/'  # 输出:hello universe
- 全局替换:g
echo "hello world world" | sed 's/world/universe/g'  # 输出:hello universe universe
- 指定第几个替换:(指定第二个替换)
echo "hello world world" | sed 's/world/universe/2'  # 输出:hello world universe
- 匹配模式替换
echo "hello world" | sed '/world/s/hello/hi/'  # 输出:hi world
指定行进行替换
- 在特定行进行替换
sed '2s/original/replacement/' file.txt  # 替换第2行的内容
- 在行号范围内替换
sed '2,4s/original/replacement/' file.txt  # 在第2到第4行进行替换
- 匹配模式进行替换
sed '/pattern/s/original/replacement/' file.txt  # 在包含pattern的行进行替换
删除行
- 删除指定行
sed '2d' file.txt  # 删除第2行**删除行号范围内的行**sed '2,4d' file.txt  # 删除第2到第4行
- 删除匹配模式的行
sed '/pattern/d' file.txt  # 删除包含pattern的行
插入和追加文本
- 在指定行前插入文本
sed '2i\插入的文本' file.txt  # 在第2行前插入文本
- 在指定行后追加文本
sed '2a\追加的文本' file.txt  # 在第2行后追加文本
替换整个文件
使用 -i 选项可以直接在文件内执行替换操作
sed -i 's/original/replacement/g' file.txt  # 直接修改文件内容,替换所有匹配项
高级用法
多点编辑
可以通过 -e 选项进行多次编辑。
sed -e 's/old1/new1/' -e 's/old2/new2/' file.txt
使用脚本文件
如果有一系列的 sed 命令,可以将它们放在一个脚本文件中,然后使用 -f 选项执行。
# commands.sed
s/original/replace1/
s/old/replace2/# 使用命令执行
sed -f commands.sed file.txt
替换时使用正则表达式
echo "abc123def" | sed -r 's/[0-9]+/[digits]/'  # 输出:abc[digits]def
保留备份文件
在使用 -i 选项时,可以通过添加扩展名来保存备份。
sed -i.bak 's/original/replacement/' file.txt  # 修改文件内容并保留备份 file.txt.bak
只打印匹配的行
结合 -n 选项和 p 命令,只打印与特定模式匹配的行。
sed -n '/pattern/p' file.txt
处理多行文本
# 交换每两行的内容
sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' file.txt  # 将每两行交换位置
复杂替换示例
# 假设file.txt 内容如下:
# alpha beta
# gamma deltased 's/\([aeiou]\)/<\1>/g' file.txt  # 将所有元音替换为<元音>
# alpha beta => <a>lph<a> b<e>t<a>
# gamma delta => g<a>mm<a> d<e>lt<a>
总结
| 命令/选项 | 含义 | 示例 | 
|---|---|---|
| -n | 取消默认输出 | sed -n 'p' file.txt | 
| -e script | 允许多行脚本 | sed -e 's/foo/bar/' -e 's/baz/qux/' file.txt | 
| -i[SUFFIX] | 直接编辑文件,备份可选 | sed -i 's/foo/bar/g' file.txt | 
| -r | 使用扩展正则表达式 | sed -r 's/[0-9]+/NUMBER/' file.txt | 
| s/old/new/g | 替换文本 | sed 's/foo/bar/g' file.txt | 
| p | 打印行 | sed -n '2p' file.txt | 
| d | 删除行 | sed '3d' file.txt | 
| a\text | 在当前行后追加文本 | sed '3a\Hello World' file.txt | 
| i\text | 在当前行前插入文本 | sed '3i\Hello World' file.txt | 
| c\text | 替换行 | sed '3c\Hello World' file.txt | 
| {} | 指定区间的操作 | sed '2,4{s/foo/bar/g}' file.txt | 
| y/abc/ABC/ | 转换字符 | sed 'y/abc/ABC/' file.txt | 
| q | 退出 | sed '5q' file.txt |