Sed流编辑器总结

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