【Linux进阶命令 03】sed (文本的流编辑器)

简介: 【Linux进阶命令 03】sed (文本的流编辑器)

文章目录


一、简介以及与grep、awk比较

sed命令是一个流编辑器,用于在Linux上执行基本的文本操作。它可以根据脚本的指令来处理、编辑文本文件。sed命令通常用于查找和替换文件中的字符串,但它还可以执行其他操作,例如删除行、插入行、打印行等。


sed :stream editor for filtering and transforming text

注:在 Linux 中,流通常指从文件、管道或其他程序的输出中读取的数据流。sed 是一种流编辑器,它可以对这些数据流进行操作。


到此,已经介绍到Linux的第三大文本分析工具了,前介绍的有:

  1. 【Linux进阶命令 01】grep(文本的全局搜索与打印)
  2. 【Linux进阶命令 02】awk(更加强大的文本分析工具)

这三个工具都是用于处理文本的,但它们的侧重点各不相同。

grep:grep是一个用于在文件中查找模式的工具。它可以搜索文件中的文本,并将包含该模式的行打印到标准输出。grep通常用于查找文件中的特定字符串或模式。

sed:sed是一个流编辑器,用于在Linux上执行基本的文本操作。它可以根据脚本的指令来处理、编辑文本文件。sed命令通常用于查找和替换文件中的字符串,但它还可以执行其他操作,例如删除行、插入行、打印行等。

awk:awk是一种强大的文本处理工具,它可以对文本进行格式化和处理。awk命令通常用于从文件中提取数据并对其进行格式化。


注:

  1. 1.它们不会直接修改源文件数据,只会修改缓冲区数据(然后打印出来);
  2. 2.它们都是基于行来处理数据的,即一行一行地处理;
  3. 3.脚本(规则)文件后缀没有特别要求,但最好可读性强,如:rule.awk、rule.txt、rule.sed
  4. 4.它们都支持正则表达式匹配文本。


二、sed语法

sed [OPTION]... ‘script’ [input-file]...

(方括号表示是可选项,下同)

常用的选项(optinon):

option是可选项,如果留空,则默认打印所有行

  • -n:静默输出,即不打印任何内容。
  • -e:允许对输入数据应用多条sed命令编辑。
  • -i:直接修改文件内容,而不是输出到终端。
  • -r:支持使用扩展正则表达式。
  • -f:从文件中读取sed脚本。
  • -h:禁止输出文件名。
  • -V:显示版本信息。


若果使用了-f选项,就从脚本读取命令;否则就执行 ‘scrip’(这里的script表示一些简单、简短的操作,如果是复杂操作,最好放到脚本文件中,增强可读性)出的命令:


1.sed ‘’ file.txt:打印文件所有行

2.sed -f rule.sed file.txt:按照规则文件处理文件

3.sed 's/foo/bar/g' file.txt:将所有foo字符串替换为bar


以下是一些常见的sed操作(在script中使用):

  • s:替换操作,用于替换文本中的字符串。
  • d:删除操作,用于删除文本中的行。
  • p:打印操作,用于打印文本中的行。
  • a:追加操作,用于在指定行后追加文本。
  • i:插入操作,用于在指定行前插入文本。
  • c:替换操作,用于替换指定行的文本。
  • y:转换操作,用于将字符从一个集合转换为另一个集合。


三、sed使用示例

测试文件:rfc4234.txt

The exact nature of the review within the IETF is not specified,
 but it is expected that documents be posted for review in the relevant WG mailing lists.
 Often no relevant mailing list exists,
 in which case area-specific or IETF main discussion list can be used.
 Individual reviewers, review teams,
 and review boards for specific topics can also be used.
 If no sufficient review has been obtained, the AD should solicit it explicitly.

3.1 字符串替换:s

这是最常用的操作,格式:

sed ' [address-range|pattern-range] s/original-string/replacement-string/ [substitute-flags]' inputfile


其中:

address-range 是文本的范围 (行起始位置)。例如,1,10 表示从第一行到第十行;

/pattern/ 表示匹配包含 pattern 的行。

original-string 是要被替换的字符串,

replacement-string 是替换后的字符串。

substitute-flags 是可选的标志,用于控制替换操作的行为:


常用的标志包括:

g:全局替换,即替换所有匹配的字符串,而不仅仅是第一个。

n:打印匹配行以外的所有行。

p:打印匹配行(如过只想打印匹配行,使用 -n选项)。

i:忽略大小写。

数字(1-512,假设数字是n),只修改某一行匹配到的的第n个

w file:将匹配行写入文件 file 中。


例1: 替换所有匹配的字符串

将所有含的of(忽略大小写)替换成0,并打印修改过的行

root@CQUPTLEI:~/Linux_test# sed -n  's/of/0/gpi' rfc4234.txt
The exact nature 0 the review within the IETF is not specified,
 0ten no relevant mailing list exists,

以下两种方法,都没有上述输出效果:

 sed  's/of/0/gpi' rfc4234.txt
 sed -n  's/of/0/gi' rfc4234.txt

-n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行。

例2: 替换所有匹配得到单词

现在要求只能在匹配到整个单词时才能替换,如often不会被替换

root@CQUPTLEI:~/Linux_test# sed -n  's/\<of\>/0/gpi' rfc4234.txt
The exact nature 0 the review within the IETF is not specified,


\<of\>表示整个单词(正则表达式)

例3: 只替换匹配的第2个

root@CQUPTLEI:~/Linux_test# sed -n  's/review/0/p2' rfc4234.txt
 Individual reviewers, 0 teams,

例4 : 只对某几行匹配

对3到7行进行匹配

sed -n  '3,7s/review/0/p2' rfc4234.txt

3.2 删除:d

用于删除指定的行或行范围。d命令的一般形式为:

sed ' [address-range|pattern-range] d' inputfile


其中,address-range 是文本的范围 (行起始位置)。例如,1,10 表示从第一行到第十行;/pattern/ 表示匹配包含 pattern 的行。

例5: 删除1到4行

root@CQUPTLEI:~/Linux_test# sed '1,4d' rfc4234.txt
 Individual reviewers, review teams,
 and review boards for specific topics can also be used.
 If no sufficient review has been obtained, the AD should solicit it explicitly.

例6: 删除包含is的行

root@CQUPTLEI:~/Linux_test# sed '/is/d' rfc4234.txt
 Individual reviewers, review teams,
 and review boards for specific topics can also be used.
 If no sufficient review has been obtained, the AD should solicit it explicitly.

3.3 打印:p

sed ‘2p’ test 重复打印第 2 行
sed ‘1,3p’ test 重复打印第1~3行
sed -n ‘2p’ test 只打印第 2 行
sed -n ‘1,3p’ test 只打印第 1~3 行
sed -n ‘/hani/p’ test 打印匹配到 hani 的行,类似grep
sed -n ‘/hani/!p’ test ! 反选,打印没有匹配到 hani 的行
sed -n ‘s/old/new/gp’ test 只打印匹配替换的行

3.4 追加行:a

a命令是sed中的新增命令,用于在指定的行后面添加新的文本。a命令的一般形式为:

sed ' [address-range|pattern-range] a\ [text]' inputfile

其中,address-range 是文本的范围 (行起始位置)。例如,1,10 表示从第一行到第十行;/pattern/ 表示匹配包含 pattern 的行。text 是要添加的文本。

例7: 在1到4行,每行,后面添加一行内容

root@CQUPTLEI:~/Linux_test# sed '1,4a\这是新加的' rfc4234.txt
The exact nature of the review within the IETF is not specified,
这是新加的
 but it is expected that documents be posted for review in the relevant WG mailing lists.
这是新加的
 Often no relevant mailing list exists,
这是新加的
 in which case area-specific or IETF main discussion list can be used.
这是新加的
 Individual reviewers, review teams,
 and review boards for specific topics can also be used.
 If no sufficient review has been obtained, the AD should solicit it explicitly.

3.5 插入行:i

和追加一样,只不过是在前面插入一行。

3.6 替换行:c

格式同上,替换匹配的行(一整行都替换掉)。

3.7 字符集替换:y

y命令是sed中的转换命令,用于将指定字符集中的字符替换为另一个字符集中的字符。y命令的一般形式为:

sed ' [address-range|pattern-range] y/ [source-chars]/[dest-chars]/' inputfile

其中,address-range 是文本的范围 (行起始位置)。例如,1,10 表示从第一行到第十行;/pattern/ 表示匹配包含 pattern 的行。source-chars 是要替换的字符集,dest-chars 是要替换成的字符集,即将source-chars中的第一个字符替换成dest-chars 中的第一个字符,依次类推。


例8: 将abcd所有小写转为大写

root@CQUPTLEI:~/Linux_test# sed  'y/abcd/ABCD/' rfc4234.txt
The exACt nAture of the review within the IETF is not speCifieD,
 But it is expeCteD thAt DoCuments Be posteD for review in the relevAnt WG mAiling lists.
 Often no relevAnt mAiling list exists,
 in whiCh CAse AreA-speCifiC or IETF mAin DisCussion list CAn Be useD.
 InDiviDuAl reviewers, review teAms,
 AnD review BoArDs for speCifiC topiCs CAn Also Be useD.
 If no suffiCient review hAs Been oBtAineD, the AD shoulD soliCit it expliCitly.
相关文章
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1137 1
二、Linux文本处理与文件操作核心命令
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
848 137
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1818 58
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1745 2
|
Linux iOS开发 计算机视觉
GIMP 3.0.6 (Linux, macOS, Windows) 发布 - 免费开源图像编辑器
GIMP 3.0.6 (Linux, macOS, Windows) 发布 - 免费开源图像编辑器
774 0
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
1005 16
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
1152 0
Linux内存问题排查命令详解
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
2314 0
|
安全 Linux Shell
Linux系统中sudo命令的高效运用技巧。
用户可以通过sudo -l来列出自己目前可执行的命令列表,这有助于用户了解自己的权限范围。
500 0
|
监控 Linux Shell
linux命令
常用 Linux 命令汇总