Linux系统shell程序设计(六)-sed命令详解(理论+实战)

一、命令参数和语法

1.1 sed命令简介

sed命令是⼀个非交互式的文本编辑器,它可以从文件或者标准输入中⼀次读取⼀行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,⼀直到所有的文本行都处理完毕。

通常情况下,sed命令会适用于以下几种场合:

  • 编辑⼀个非常大的文本文件,以至于使用普通的交互式编辑器非常慢。
  • 编辑命令比较复杂,在普通的文本编辑器中难以完成。
  • 扫描⼀个比较大的文本文件,并且需要经过⼀系列的操作

1.2 常用参数

sed命令的基本语法

sed <options> <commands> <inputfile>

 options 代表 sed 命令的选项参数,常用参数如下:

参数

说明

-n

取消默认输出。

-e

允许执行多个脚本。

-f

从脚本文件中读取命令。

-i

直接修改原始文件。

-l

指定行的长度。

-r

在脚本中使用扩展正则表达式

-s

默认情况下,sed将把命令行指定的多个文件名作为⼀个长的连续的输入流。而 sed则允许把它们当做单独的文件,这样的话,正则表达式不不行跨文件匹配。

-u

最低限度的缓存输入与输出。

二、文本定位方式

通常情况下,⼀个完整的sed命令由定位参数编辑命令两部分组成。

sed <options> <commands> <inputfile>

通过定位参数, sed 命令可以对特定的文本行进行操作。sed 命令提供了两种方式来实现文本行的定位:

行号定位

正则表达式定位

其中正则表达式定位语法比较简单,两个斜线之间的 regexp 就是正则表达式

/<regexp>/

2.1 行号定位

定位某个特定的行

在sed命令中,指定某个特定的文本行的语法如下:

x

x 是⼀个整数,代表特定文本行的行号。例如,现在想定位到第10行,则可以使用以下语句:

10

 定位某段连续的行

sed 使用以下语法来指定某一段连续的文本行:

x,y

x 代表起始行的行号y 代表终止行的行号。以上语法即指定从 x 行开始⼀直到y 行的所有的文本行

指定起始行和步长

在某些情况下,用户需要的不是⼀段连续的文本行,而是⼀段有固定间隔的行,例如偶数行、奇数行等。在这种情况下,可以使用以下语法来指定文本行的步长:

<first>~<step>

first step 都是整数,其中 first 指定起始行step 指定行号增长的步长

例如指定偶数行:

0~2

指定奇数行:

1~2

指定第一行和最后一行

指定文件的第⼀行比较简单,直接使用数字1即可:

1

对于文件的最后⼀行,sed命令专门提供了⼀个操作符 $ 来指定文件最后一行的语句: 

$

 指定某行后面几行

在sed命令中,用户可以采用相对定位的方法来指定行:

<x>,+<n>

其表示指定从 x 行以及后面的 n 行文本

2.2 行号定位示例

这里是一个示例,tmp.txt6行文本,sed命令后面引号内的p就是前面说的编辑命令,表示打印的意思,默认会输出所有文本行,可以使用-n参数取消默认操作,这一块后面会讲解。第三个命令引号内的1表示行号,意为选择第一行文本。第四个命令中的1逗号2,表示选择第一行和第二行。第五个命令中的$符号表示最后一行。第6个命令中的1波浪线3表示从第一行开始,然后再数三行,也就是第四行,即选择第一行和第四行。最后的3逗号加号2表示从第三行还是再加2行,共三行

三、常用示例

 3.1 选择(打印)文本

sed 命令中,可以通过编辑命令 p 将选择的文本打印出来。

“<位置参数> p”

如果省略位置参数,则代表选择整个文件。编辑命令 p 表示将缓冲区中的文本行执行输出操作,即打印(print)缓冲区中的文本。

3.2 替换文本

sed 命令中,可以通过编辑命令 s 来实现文本的替换。

“<位置参数> s/<pattern>/<replacemen>/<flag>”

 pattern 为使用正则表达式表示的匹配模式replacement 为用来替换的由⼀般字符组成的字符串flag 为替换标志,它的值会影响到 s 命令的行为。

flag

说明

g

全局(global)匹配,会替换文本行中所有符合规则的字符串

十进制数字

如果 flag 为⼀个十进制数字 n,则表⽰替换文本行中第 n 个符合规则的字符串

p

替换第 1 个符合规则的字符串,并且将缓冲区输出到标准输出

w <文件>

替换第 1 个符合规则的字符串,并且将受影响的行输出到磁盘文件中

如果没有指定 flag,则替换文本行中的第 1 个符合规则的字符串

我们将使用s编辑命令替换源文件中的小n为大N

2个命令使用了g选项用来全局替换小n为大N,注意我们的位置参数是1,即选择第一行。可以看到第一行的两个小n都被替换为大N

3.3 删除文本

sed 命令中,可以通过编辑命令 d 将选定的文本行删除。

“<位置参数> d”

 如果省略位置参数,则代表删除文本文件中所有行。

sed命令中,可以通过编辑命令d来删除某些文本行。

如果省略位置参数,则表⽰删 除⽂本⽂件中的所有的⾏

在执⾏删除操作时,sed命令会⾸先读取 ⼀⾏⽂本到缓冲区,然后将符合位置参数的⽂本⾏删除,接着读取并 处理下⼀⾏。

3.4 追加文本

sed 命令中,可以通过编辑命令 a 指定的位置后面追加文本。 

“<位置参数> a <需要添加的文本>”

注意:编辑命令 a 最多只能使用⼀个位置参数。

 3.5 插入文本

sed 命令中,可以通过编辑命令 i 指定的位置前面插入文本。

“<位置参数> i <需要插入的文本>”

注意:编辑命令 i 最多只能使用⼀个位置参数。

 

四、进阶操作

这里我们只介绍一个进阶用法,那就是一次执行多个子命令。

sed命令的-e选项可以使sed将跟在其后⾯的字符串作为子命令执 ⾏。在前⾯的⼤部分例⼦中,由于都只有一个子命令,所以将该选项省 略了。但是,如果想要为sed命令同时指定多个子命令,则必须使⽤多 个-e选项。

这里我们使用两个-e选项,第一个子命令表示在第一行后面添加一个文本行,第二个表示将小m替换为大M

注意输出中第二行的小m没有被替换,这说明所有的⼦命 令都是对缓冲区中的数据进⾏处理的,,sed命令 会逐⾏读取⽂本到缓冲区中,然后依次应⽤各个⼦命令,

sed 命令中,可以通过添加多个 -e 参数执行多个子命令。

-e “<位置参数1> <编辑命令1>” -e “<位置参数2> <编辑命令2>” …

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值