sed工具详解

目录

sed工具概述

sed 命令常见用法

用法示例

 

 

 

sed工具概述

文本处理器

在Linux/UNIX系统中包含很多种类的文本处理器或文本编辑器,其中包括我们之前学习过的VIM编辑器与grep等。而 grep,sed,awk 更是shell 编程中经常用到的文本处理工具,被称之为Shell编程三剑客

 

 

sed工具

sed (stream

EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。

sed 的工作流程主要包括读取、执行和显示三个过程。

读取:sed

从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,patternspace) 。

执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

 

注意:默认情况下所有的sed

命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

 

 

sed 命令常见用法

通常情况下调用sed 命令有两种格式,如下所示。其中,"参数"是指操作的目标文件,

当存在多个操作对象时用,文件之间用逗号","分隔;而scriptfile表示脚本文件,需要用"-f"

选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。

 

sed[选项]'操作'参数

sed[选项]-f scrliptfile参数

常见的sed命令选项主要包含以下几种。

-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。

-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。

-h或--help:显示帮助。

-n、 --quiet或silent:表示仅显示处理后的结果。

-i.bak:直接编辑文本文件。

-r,-E使用扩展正则表达式

-s将多个文件视为独立文件,而不是单个连续的长文件流

 

 

"操作"用于指定对文件操作的动作行为,也就是sed

的命令。通常情况下是采用的"[n1[,n2]]“操作参数的格式。n1、n2

是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为"5,20动作行为”。常见的操作包括以下几种。

a:增加,在当前行下面增加一行指定内容。

c:替换,将选定行替换为指定内容。

d:删除,删除选定的行。

i:插入,在选定行上面插入一行指定内容。

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。

s:替换,替换指定字符。

y:字符转换。

 

用法示例

在本小节中依旧以 11.txt文件为例进行演示。

(1)输出符合条件的文本(p表示正常输出)(搜索)

sed -n 'p' 11.txt     //输出的内容,等同于 cat 11.txt

 

在执行"sed -n '10,${n;p}'11.txt"命令时,读取的第1行是文件的第10 行,读取的第2行是文件的第11行,依此类推,所以输出的偶数行是文件的第11行、13行直至文件结尾,其中包括空行。

ifconfig ens33 | sed -n 2p#直接显示第二行内容

 

 

以上是sed 命令的基本用法,sed命令结合正则表达式时,格式略有不同,正则表达式以"/"包围。例如,以下操作是 sed命令与正则表达式结合使用的示例。

 

 

(2)删除符合条件的文本(d)

因为后面的示例还需要使用测试文件11.txt,所以在执行删除操作之前需要先将测试文件备份。以下示例分别演示了sed命令的几种常用册删除用法。

下面命令中 nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。

 

案例:

nl 11.txt | sed '8d'   ##删除第8行

nl 11.txt | sed '1,9d'   ##删除1-9行

nl 11.txt | sed '/the/d'  ##删除包含the的行

nl 11.txt | sed '/the/!d'  ##!取反 删除没有the的行

sed '/^[a-z]/d' 11.txt    ##删除以a-z所有小写字母开头的行

sed '/\.$/d' 11.txt    ##删除以“.”结尾的行

sed '/^$/d' 11.txt   ##删除所有空行的行

 

注意︰若是删除重复的空行﹐即连续的空行只保留一个,"cat -s test.txt"。

 

(3)替换符合条件的文本

在使用sed命令进行替换操作时需要用到s(字符串替换)、c(整行/整块替换)、y(字符转换)命令选项,常见的用法如下所示。

案例:

sed 's/the/THE/' 11.txt  ##将每行的第一个the替换成THE

sed 's/l/L/1' 11.txt  ##将每行的第二个l替换成L

sed 's/the/THE/g' 11.txt  ##将全文中所有the 替换成THE

sed 's/o/ /g' 11.txt   ## 将全文所有o 删除(替换成空串)

sed 's/^/#/' 11.txt   ##在每行行首插入#号

sed 's/$/EOF/' 11.txt  ##在每行行尾插入EOF

sed '3,5s/the/THE/g' 11.txt    ##将3-5行中所有the替换成THE

sed '/the/s/o/O/g' 11.txt    ##将包含the的所有行中的o替换成O

sed '/the/s/^/#/' 11.txt     ##在包括the的每行行首插入#号

 

sed 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

 

 

(4)迁移符合条件的文本

在使用sed命令迁移符合条件的文本时,常用到以下参数.

H:复制到剪贴板;

g、G:将剪贴板中的数据覆盖/追加至指定行;

w:保存为文件;

r:读取指定文件;

a:追力加指定内容。具体操作方法如下所示。

l, i忽略大小写

 

案例:

sed '/the/{H;d};$G' 11.txt   ##将包含the的行迁移到文件末尾,{;}用于多个操作

sed '1,5{H;d};15G' 11.txt   ##将1-5行内容转移至15行后

sed '/the/w out.file' 11.txt   ##将包含the 的行另存为文件out.file

sed '/the/r /etc/hostname' 11.txt   ##将文件/etc/hostname 的内容添加到包含the的每行之后

sed '3aNEW' 11.txt   ##在第3行后插入一个新行,内容为NEW

sed '/the/aNEW' 11.txt  ##在包含the的每行后插入一个新行,内容为NEW

sed '3aNEW1\nNEW2' 11.txt   ##在第3行后插入多行内容,中间的\n表示换行

 

 

(5)使用脚本编辑文件

使用sed脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过"-f"选项来调用。例如执行以下命令即可将第1~5行内容转移至第16行后。

sed '1,5{H;d};16G' 11.txt   ##将1-5行内容转移至16行后

 

vim open.list

1,5H
1,5d
16G

sed -f open.list 11.txt   

 

posted @   请叫喵总  阅读(556)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示