Linux sed 命令
定义
sed 命令是将一系列的编辑命令应用于一批文本的理想工具。sed 命令拥有非交互式和高效的特点。
它可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。
sed 命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。
sed 命令的基本语法如下:
sed [options] [script] [inputfile...]
工作方式
(1)首先,用户可以在命令行直接执行 sed 命令,其基本语法如下:
sed [options] commands inputfile
(2)其次,用户可以将 sed 操作命令写入脚本文件,然后通过 sed 命令读取该文件并且执行其中的命令,其基本语法如下:
sed [options] -f script inputfile
(3)最后,用户通过将 sed 的操作命令写入文件,然后将该脚本文件授予用户执行权限,其基本语法如下:
./script inputfile
其中,script 代表保存 sed 命令的脚本文件。在脚本文件中,用户应该在 #! 符号后面执行该脚本的解释器,因此在这种方式下,sed 脚本文件的第一行应该如下:
#! /bin/sed
使用行号定位文本行
定位某个特定的行,语法如下: x
定位某段连续的行,语法如下: x,y
指定起始行和步长: first~step
指定文件的第一行和最后一行
- 第1行:
1
- 最后1行:
$
指定某行后面的几行,语法如下: x,+n
使用正则表达式定位文本行:
除了使用行号定位文本行之外,sed 命令还支持正则表达式定位。sed 命令中,正则表达式的语法如下:
/regexp/
除了定位参数之外,sed 命令的另外一个组成部分就是编辑命令。常用的编辑命令有打印、插入、删除以及替换等。
sed 命令的基本语法
[address1[,address2]] command [argument]
a\
在当前行下面插入文本。
i\
在当前行上面插入文本。
c\
把选定的行改为新的文本。
d
删除,删除选择的行。
D
删除模板块的第一行。
s
替换指定字符
h
拷贝模板块的内容到内存中的保持缓冲区,覆盖。
H
追加模板块的内容到内存中的保持缓冲区,追加。
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P
(大写) 打印模板块的第一行。
q
退出 Sed。
r file
从file中读行。
w file
写并追加模板块到 file 末尾。
W file
写并追加模板块的第一行到 file 末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
=
打印当前行号码。
在sed命令中,选择文本行主要通过位置参数来完成,基本语法如下:
[address1[,address2]] p
在上面的语法中,address1 和 address2都是位置参数。如果省略位置参数,则表示选择整个文件。子命令 p 表示将缓冲区中的文本行执行输出操作,即打印(print)缓冲区中的文本。
【例1】演示使用行定位方法来选择输出某些文本行
#! /bin/bash
#输出1~3行,不使用-n选项
sed '1,3p' students.txt
echo "===================================="
#输出1~3行,使用-n选项, -n或--quiet:仅显示script处理后的结果;
sed -n '1,3p' students.txt
[root@linux chapter10]# ./ex10-1.sh
200200110 Abdul
200200110 Abdul
200200164 Abram
200200164 Abram
200200167 Bartley
200200167 Bartley
200200168 Bennett
200200172 Cecil
200200173 John
200200187 Cat
====================================
200200110 Abdul
200200164 Abram
200200167 Bartley
【例2】演示使用正则表达式来作为定位参数
#! /bin/bash
#使用正则表达式定位
result