Linux:文本处理三剑客之sed命令用法详解
一、功能介绍
sed的全称是Stream EDitor,中文意思为流编辑器,是Linux系统中文本处理三剑客之一,其它两个是grep和awk,grep命令功能及其用法在前两篇文章《Linux中grep命令功能及用法详解》和《Linux系统常用命令用法详解》中已经做了很详细的介绍,有需要的读者可以点击查看原文。Linux系统中一切皆文件,对Linux的操作就是对文件的处理,用户要更好的处理文件,就要用到我们上面提到的三剑客命令。三剑客命令的主要负责功能为:grep主要用于查找,sed用于读取行和替换。awk用于取列。
Linux的sed命令是利用脚本来处理文本文件,sed 可依照脚本的指令来处理、编辑文本文件。该命令对输入文件进行流式处理,也就是逐行读取输入文件的内容(文件或管道),处理后输出,不直接修改源文件(除非使用 -i
选项)。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed命令是Linux系统中非常强大的文本处理工具,常用于文本替换、删除、插入等操作,使用sed命令可以提高文本处理的效率。通过结合正则表达式和多个编辑命令,可以实现更复杂的文本操作。关于Linux系统中的正则表达式的语法及各种符号的含义,在《Linux中grep命令功能及用法详解》中有详细的介绍,本文不再赘述,有需要的可移步该文章查看。
Sed命令常用于日志处理、配置修改、数据清洗等, 主要功能包括: 1)文件中的文本替换(如 s/old/new/g
);2)行删除/插入/追加(d
, i
, a
);3)多命令组合(支持复杂逻辑);4)基于地址定界(行号或正则匹配)。
欢迎关注工 众 号:ItBeeCoder,查看更多高质量技术文章,发送“ds”获取 deepseek 资 料
二、基本语法
sed [选项] '脚本命令' 文件名
sed [选项] -e '命令1' -e '命令2' 输入文件名 # 多命令
sed [选项] -f 脚本文件 输入文件名 # 从文件读取命令
三、选项参数说明
-n, --quiet, --silent:取消自动打印模式空间,抑制默认输出,仅打印处理的行,常与 -p` 选项配合使用
-p ∶列印,即将某个选择的资料印出
-e <脚本>, --expression=脚本:添加“脚本”到程序的运行列表,多个命令时使用该选项
-f <脚本文件>, --file=脚本文件:添加“脚本文件”到程序的运行列表,用于从文件中读取编辑命令
--follow-symlinks:直接修改文件时跟随软链接
-i[扩展名], --in-place[=扩展名]:直接在原文件修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N:指定“l”命令的行长度(处理长行时使用)
--posix:关闭所有 GNU 扩展
-r, --regexp-extended:在脚本中使用扩展正则表达式,支持 `+`, `?`, `|` 等
-s, --separate:将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered:从输入文件读取最少的数据,更频繁的刷新输出
--help:打印帮助并退出
--version:输出版本信息并退出
-a ∶新增内容,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-d ∶删除,因为是删除,所以 d 后面通常没有任何内容
-i ∶插入内容,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-s ∶取代,可以直接进行取代的工作!通常-s 搭配正规表达式一起使用
注:Sed命令后如果没有给出 -e, --expression, -f, 或 --file 选项,则第一个非选项参数将被视为要解释的 sed 脚本。所有剩余的 输入都将被视为输入文件名;如果没有指定输入文件,则读取标准输入。
欢迎关注工 众 号:ItBeeCoder,查看更多高质量技术文章,发送“ds”获取 deepseek 资 料
四、常用用法示例
1、替换命令(s)
1)替换某个字符串
Sed命令可用于将文本中的某个字符串替换为另一个字符串,命令格式为:
sed 's/原字符串/新字符串/[flags]' 文件
s/模式/替换内容/[flags]
flags是可选的,具体值有:
(a) `g`:全局替换,默认情况下每行只替换第一个匹配到的内容, `g`表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写
(b)`p`:替换后打印该行(需与 `-n` 配合)。
(c)`i`:忽略大小写。
例1:
echo "hello world" | sed 's/world/linux/' # 输出 "hello linux"
sed 's/a/A/2' file.txt # 每行第二个a替换为A
例2:将文件file.txt中的第一个匹配项“old”替换为“new”。
sed 's/old/new/' file.txt
例3:将testfile.txt中的第一个b替换为B:
sed 's/b/B/' testfile.txt
例4:批量替换文件内容:
a)将testfile.txt中的所有数字替换为好的,会编辑原文件
sed -i 's/[0-9]/好的/g' testfile.txt
b)将文件testfile.txt中的所有“unhappy”替换为“happy”,并将结果重定向输出到testfileNew.txt
sed 's/unhappy/happy/g' testfile.txt> testfileNew.txt
2)替换某行内容
命令格式1:sed '行号c 新字符串' 文件名
命令格式2:sed '起始行号,终止行号c 新字符串' 文件名
2、删除命令(d)
删除命令用于删除指定的行或匹配的行,例如:
sed '3d' file.txt # 删除文件file.txt中的第3行
sed '/error/d' file.txt # 删除含"error"的行
sed '1,5d' file.txt # 删除1-5行
sed $d testfile.txt # 若要删除文件的最后一行
3 插入命令(i)
插入命令用于在指定行之前插入新内容。
例如:在文件file.txt的第三行之前插入“新插入内容”
sed '3i\新插入内容' file.txt
4、追加命令(a)
追加命令用于在指定行之后追加新内容。
例如:在文件file.txt的第三行之后追加“new line”
sed '3a\new line' file.txt
sed '/pattern/a\new content' file.txt # 在匹配行后追加
5、行操作命令
1)打印命令(p):该命令用于显示指定的行或匹配的行。例如:显示文件file.txt中的第1到5行,配合 -n
使用,
sed -n '1,5p' file.txt
2)转换字符 y
:sed ‘y/abc/ABC/’ file.txt(类似
tr命令)。 3)写文件
w:
sed -n ‘/error/w error.log’ file.txt` 将匹配行写入文件。
6、多命令组合
命令格式:sed -e 命令1 -e 命令2 -e 命令3
一些场景中有多个替换条件,可以使用“-e”参数将这些替换条件连接起来,一次性完成所有的替换操作。
例1:将上述的两种命令连接起来:“sed -e ‘s/原字符串/新字符串/’ ‘行号c 新字符串’ 文件”。
sed -e 's/b/B/g' -e '3,4c this is new Test' testfile.txt
注意:这里的/可以由@替换
例2::将文件file.txt中的“old”替换为“new”,然后删除第二行。
sed -e 's/old/new/' -e '2d' file.txt
sed -e 's/foo/bar/' -e '5d' file.txt
sed '3 {s/foo/bar/; s/baz/qux/}' file.txt # 对第3行执行多个命令
7、搭配正则表达式使用
sed支持正则表达式,可以进行更复杂的匹配和替换操作。例如:将文件file.txt中的三个连续数字替换为相同的数字。
sed 's/[0-9]\{3\}/&/' file.txt
sed '/^$/d' file.txt # 删除空行
sed '/^#/d' config.conf # 删除注释行(以#开头)
8、直接修改文件
使用-i选项可以直接修改文件内容,而不需要输出到标准输出。例如:将文件file.txt中的“old”替换为“new”。
sed -i 's/old/new/' file.txt
9、在管道中使用sed
在打印文件file.txt之前,先使用pr命令添加页码,然后使用sed命令进行替换,最后使用enq命令打印已编辑的列表。
pr file.txt | sed 's/blue/red/g' | enq
10、分支与循环
:label
定义标签,b label
跳转,t
条件跳转。
sed ':loop; s/foo/bar/2; t loop' file.txt # 替换每行第二个foo,直到无匹配
11、使用sed命令处理特殊字符
sed 's/\/path\/to/\/new\/path/' file.txt # 转义斜杠
sed 's|/path/to|/new/path|' file.txt # 使用|作为分隔符
12、显示选定的行(-n选项)
显示文件file.txt中包含“word”的行。
sed -n '/word/p' file.txt