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 delta
sed '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 |