sed命令

sed(stream editor) 是 Linux 和 Unix 中的一个流编辑器,用来对文本进行插入、删除、替换、查找等操作。它可以处理文本文件或者标准输入,常用于自动化的文本处理、批量文件修改。

1. sed 的基本语法

sed [options] 'command' file
  • options:可选参数,用来控制 sed 的行为。
  • command:执行的 sed 命令,比如替换、删除等。
  • file:要处理的文件。

2. 常用选项

  • -e:用于执行多个 sed 命令。
  • -i:直接修改文件(即对文件内容进行原地编辑)。
  • -n:取消默认输出,只输出被处理过的行。
  • -r:启用扩展的正则表达式。
  • -f:从脚本文件中读取 sed 命令。

3. sed 常见命令

  • s/pattern/replacement/:查找并替换匹配的模式。
  • d:删除行。
  • p:打印行。
  • a:在指定行后添加内容。
  • i:在指定行前插入内容。
  • q:在指定行后退出处理。

4. 使用示例

4.1. 替换文本

将文件 example.txt 中所有的 apple 替换为 orange

sed 's/apple/orange/g' example.txt
  • s:表示替换。
  • /g:全局替换,即一行中所有出现的匹配项都替换。

示例:只替换每行的第一个匹配

sed 's/apple/orange/' example.txt

这只会替换每行中第一个出现的 apple

4.2. 直接修改文件

如果你想直接修改文件而不是输出到屏幕,使用 -i 选项:

sed -i 's/apple/orange/g' example.txt

这将直接在文件 example.txt 中将所有 apple 替换为 orange

4.3. 匹配特定行

只替换文件中的第 2 行:

sed '2s/apple/orange/' example.txt

替换第 2 到第 4 行中的 apple

sed '2,4s/apple/orange/g' example.txt

4.4. 删除行

删除文件中的第 3 行:

sed '3d' example.txt

删除文件中包含 apple 的所有行:

sed '/apple/d' example.txt

4.5. 打印匹配的行

只打印包含 apple 的行:

sed -n '/apple/p' example.txt
  • -n:取消默认输出,只输出匹配到的内容。
  • /pattern/p:表示匹配 pattern 的行并打印。

4.6. 在某行后插入文本

在第 2 行后插入 Hello, World!

sed '2a Hello, World!' example.txt

4.7. 在某行前插入文本

在第 3 行前插入 Insert text

sed '3i Insert text' example.txt

4.8. 在正则表达式匹配的行后插入

在包含 apple 的行后插入 fruit

sed '/apple/a fruit' example.txt

4.9. 删除从某行到某行

删除第 2 行到第 4 行的内容:

sed '2,4d' example.txt

4.10. 替换带特殊字符的内容

假设文件中有 /home/user 路径,想要替换为 /home/admin,可以使用如下命令:

sed 's/\/home\/user/\/home\/admin/g' example.txt

或者使用其他分隔符避免过多的 \

sed 's#/home/user#/home/admin#g' example.txt

4.11. 组合多个命令

你可以用 -e 来执行多个命令。例如,将 apple 替换为 orange,并删除包含 banana 的行:

sed -e 's/apple/orange/g' -e '/banana/d' example.txt

5. 更复杂的示例

5.1. 替换第一个匹配和最后一个匹配

假设文件 example.txt 如下:

apple banana apple orange
apple grape apple

要替换第一行的第一个 applefruit

sed '1s/apple/fruit/' example.txt

要替换最后一行中的最后一个 apple

sed '$s/apple/fruit/' example.txt

5.2. 将每行的单词反转

假设文件 example.txt 的内容如下:

apple banana orange
grape mango peach

你可以使用 sed 和正则表达式将每行的单词顺序反转:

sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\)/\3 \2 \1/' example.txt

输出:

orange banana apple
peach mango grape