sed使用

在Linux系统中,sed(stream editor)命令是一个非常强大的文本处理工具。它主要用于对文本文件进行过滤和转换操作,支持非交互式的文本编辑。今天,我们就来深入了解一下sed命令的详细使用方法...

在Linux系统中,sed(stream editor)命令是一个非常强大的文本处理工具。它主要用于对文本文件进行过滤和转换操作,支持非交互式的文本编辑。今天,我们就来深入了解一下sed命令的详细使用方法,并结合一些实际示例来加深理解。

1. 基本语法

sed [选项] [脚本] [输入文件...]

其中每个[选项]所代表的意思如下:

-e script: 允许直接在命令行中提供编辑脚本。
-f script-file: 从指定的文件中读取编辑脚本。
-n: 仅打印经过sed处理的行,而不打印原始文件中的未修改行。
-i: 直接修改文件内容,而不是输出到标准输出(屏幕)。通常与模式字符串一起使用,以执行原地编辑。
-i.bak: 与-i类似,但会创建原始文件的备份,备份文件的名称通常在原始文件名后加上.bak。
-r: 使sed使用扩展的正则表达式,默认情况下使用基本的正则表达式。
-E: 与-r类似,但是是GNU sed的选项,用于使用扩展的正则表达式。
-u: 使sed使用默认的未缩写形式的正则表达式。
-v: 增加输出的详细程度,例如在处理时显示脚本信息。
--quiet 或 -silent: 等同于-n选项,仅打印处理后的行。
--verbose: 等同于-v选项,提供详细的处理信息。
--version: 显示sed的版本信息。
-h 或 --help: 显示帮助信息。

[脚本]:具体的编辑命令,如s/old/new/g(将所有old替换为new)

[输入文件]:需要处理的文本文件。


2. 脚本详解

sed脚本由一系列的命令组成,每个命令都由一个或多个字母缩写表示。这些命令可以操作文本,执行搜索、替换、删除、插入等操作。以下是一些常用的sed命令及其含义:

a\text:在当前行后追加\text指定的文本,并开始新的一行。
i\text:在当前行前插入\text指定的文本,并继续处理下一行。
c\text:用\text指定的文本替换当前行,并开始新的一行。
d:删除当前行,并开始新的一行。
D:删除从当前行开始到第一个非空行的所有行。
p:打印当前行的内容。
s/regexp/replacement/:使用正则表达式regexp查找并替换为replacement。这个命令有多个变体,如:
 g:全局替换,替换行中所有匹配的regexp。
 n:仅替换第n次出现的匹配。
 1:仅对第一行执行替换。
 w file:将替换的结果写入到指定的文件file中。
r file:读取file文件的内容,并插入到模式空间中。
w file:将当前模式空间的内容写入到指定的文件file中。
l:列出模式空间的内容,每个字符占一行。
N:追加下一行到模式空间中,以便进行多行操作。
P:打印模式空间中的第一行。
h:将模式空间的内容复制到保持空间(hold space)
g:从保持空间复制内容到模式空间。
G:将保持空间的内容追加到模式空间的末尾。
t label:如果上一次替换成功,则跳转到标签label处继续执行命令。
T label:如果上一次替换失败,则跳转到标签label处继续执行命令。
b label:无条件跳转到标签label处继续执行命令。


3. 常用指令

a\text - 添加新行:

sed '5a New line' file.txt #在文件file.txt的第5行之后添加文本"New line"

在文件file.txt的第5行之后添加文本"New line"

i\text - 插入文本:

sed '5i Inserted text' file.txt #在文件file.txt的第5行之前插入文本"Inserted text"

在文件file.txt的第5行之前插入文本"Inserted text"

c\text - 更换文本:

sed '5c Replaced line' file.txt #将文件file.txt的第5行替换为"Replaced line"。

将文件file.txt的第5行替换为"Replaced line"。

d - 删除行:

sed '5d' file.txt #删除文件file.txt的第5行。

删除文件file.txt的第5行。

p - 打印行:

sed -n '5p' file.txt #打印文件file.txt的第5行。

打印文件file.txt的第5行。

s/old/new/g - 替换文本

sed 's/old/new/g' file.txt

将文件file.txt中所有的"old"替换为"new"。

r file - 读取文件内容:

sed '5r anotherfile.txt' file.txt #在文件file.txt的第5行之后插入anotherfile.txt的内容。

在文件file.txt的第5行之后插入anotherfile.txt的内容。

w file - 将模式空间内容写入文件

sed -n '5,10w output.txt' file.txt #将文件file.txt的第5行到第10行的内容写入output.txt。

将文件file.txt的第5行到第10行的内容写入output.txt。

l - 列出模式空间的内容:

sed '5l' file.txt #打印文件file.txt第5行的内容,每个字符占一行。

打印文件file.txt第5行的内容,每个字符占一行。

N - 追加下一行到模式空间:

sed ':a;N;$!ba;s/\n//' file.txt #删除文件file.txt中除了最后一行以外的所有换行符。

删除文件file.txt中除了最后一行以外的所有换行符。

P - 打印模式空间的第一行:

sed '5P' file.txt #打印文件file.txt第5行之前的内容。

打印文件file.txt第5行之前的内容。

h - 将模式空间的内容复制到保持空间:

sed '5h;10g' file.txt

在文件file.txt的第5行时,将模式空间的内容复制到保持空间,并在第10行时将保持空间的内容与模式空间合并。

g - 从保持空间复制内容到模式空间:

sed '5g;10G' file.txt

在文件file.txt的第5行时,将保持空间的内容复制到模式空间,并在第10行时将模式空间的内容追加到保持空间的末尾。

G - 将模式空间的内容追加到保持空间:

sed '5G;10h' file.txt

在文件file.txt的第5行时,将模式空间的内容追加到保持空间,并在第10行时将保持空间的内容复制到模式空间。

t label - 条件跳转:

sed ':a;s/old/new/;t loop;ba' file.txt

将文件file.txt中的"old"替换为"new",如果替换成功则跳转到标签loop,否则继续执行。


  • 发表于 2024-05-20 15:38
  • 阅读 ( 509 )
  • 分类:linux

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Ti Amo
Ti Amo

48 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章