一、命令参数和语法
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.txt共6行文本,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>” …