一、基本介绍
sed编辑器也叫流编辑器(stream editor),它是根据事先设计好得一组规则编辑数据流。
交互式文本编辑器(如Vim)中,可以用键盘命令交互式地插入、删除或替换文本数据。
sed编辑器是根据命令处理数据流中的数据,这些命令来自于命令行输入,或者来自于保存在命令文本文件中。它可以执行以下操作:
- 从输入中读取一行数据;
- 根据所提供的编辑器命令匹配数据;
- 按照命令修改数据流中的数据;
- 将新的数据输出到STDOUT
sed编辑器匹配并针对一行数据执行所有命令后,就会读取下一行数据并重复这个过程,在它处理完数据流中的所有行后,就结束运行。
由于命令是按顺序逐行执行的,因此sed编辑器只需对数据流处理一遍(one pass through)即可完成编辑操作。这使得sed编辑器比交互式编辑器快得多,还可以快速完成对数据的自动修改。
格式:
sed options script file
script:制定了应用于流数据中的单个命令。如果需要多个命令,可以使用 -e 选项在命令行中指定;或者使用 -f 选项在单独的文件中指定。
-e commands | 在处理输入时,加入额外的sed命令 |
-f file | 在处理输入时,将file中指定的命令添加到已有的命令中 |
-n | 不产生命令输出,使用p(print)命令完成输出 |
二、处理文本
1、在命令行中使用单个sed编辑器命令
默认情况下,sed编辑器会将指定的命令应用于STDIN输入流中,所以可以直接将数据通过管道符传入sed编辑器进行处理。
替换命令:s;使用它可以将斜线间指定的第二个字符串替换掉第一个字符串。
echo "这是1个测试" | sed 's/1个/2个/'
批量替换文件中某个字符:
sed 's/成都/苏州/' test.txt
而且,sed编辑器并不会修改文本文件的数据,它只是将修改后的数据发送到STDOUT。
查看文本文件内容,依然未变。
2、在命令行中使用多个sed编辑器命令
如果想执行多个命令,可以使用 -e 选项。
多个命令都会应用于文件的每一行数据,命令之间必须要用分号(;)分隔开,并且命令末尾和分号之间不能出现空格。
sed -e 's/贵州/成都/;s/北京/广州/' test.txt
也可以用bash shell中的次提示符来分隔命令。
必须要在闭合的单引号所在行结束命令。因为bash shell一旦发现了闭合单引号,就会执行命令。
3、从文件中读取sed编辑器命令
可以使用 -f 选项来读取文件中的sed编辑器命令。
三、基础命令
1、替换选项
替换标志
替换命令在默认情况下只替换每行中出现的第一处匹配文本,要想替换每行中所有的匹配文本,必须使用替换标志(substitution flag),替换标志在替换命令字符串之后设置。
格式:s/pattern/replacement/flags
4种替换标志:
- 数字:指明新文本将替换行中的第几处匹配;
- g:global,指明新文件将替换行中所有的匹配;
- p:指明打印出替换后的行;
- w file:将替换的结果写入文件
第一种替换标志:数字
# 将每行中的第二个成都替换成武侯区
sed 's/成都/武侯区/2' test.txt
第二种替换标志:g(global)
#将每行中所有的成都都替换成武侯区
sed 's/成都/武侯区/g' test.txt
第三种标志:p
替换标志p会打印出包含替换命令中指定匹配模式的文本行,它通常和 -n 选项一起使用:-n 选项会抑制sed编辑器的输出,替换标志p会输出替换后的行,二者配合使用就是只输出被替换命令修改过的行。
# 将每行中的第一个成都替换成武侯区,并打印出进行过此操作的文本行
sed -n 's/成都/武侯区/p' test.txt
第四种替换标志:w file
替换标志 w 会将输出保存到指定文件中。
# 将进行过替换操作的文本行写入test1.txt中
sed 's/成都/武侯区/w test1.txt' test.txt
替代字符
sed编辑器允许选择其它字符作为替换命令的替代分隔符。如下所示,将感叹号(!)当做替换命令的分隔符。
sed 's!/bin/bash!/bin/csh!' /etc/passwd
行寻址
默认情况下,sed编辑器中使用的命令会应用于所有的文本行。如果只想将命令应用于特定的某一行或某些行,必须使用行寻址。
格式:[address] command
行寻址有2种形式:
- 以数字形式表示的行区间;
- 匹配行内文本的模式
也可将针对特定地址的多个命令分组:
address {
command1
command2
}
以数字形式的行寻址
可以用行号来引用文本流中的特定行。sed编辑器会将文本流中的第一行编号为1,第二行编号为2,以此类推。
在命令中指定的行地址既可以是单个行号,也可以用起始行号、逗号以及结尾行号指定的一个行区间。
如下所示,将第三行中的北京替换成Beijing。
sed '3s/北京/Beijing/' test1.txt
如下所示,使用了行区间,将第1行到第3行的杭州替换成Hanzhou。
sed '1,3s/杭州/Hanzhou/' test1.txt
如果想将命令应用于从某行开始到结尾的所有行,可以使用美元符号作为结尾行号。
以文本模式过滤
格式:/pattern/command
必须将指定的模式(pattern)放入正斜线内,sed编辑器才会将该命令应用于包含匹配模式的行。
如下所示,将用户csb_user1的默认shell从/bin/bash修改成/bin/csh
命令组
如果需要在单行中执行多条命令,可以使用花括号将其组合起来,sed编辑器会执行匹配地址中列出的所有命令。
也可以指定行区间
2、删除行
可以使用删除(d)命令删除文本流中的特定行,默认情况下,它会删除匹配指定模式的所有行。
删除第4行的数据:
sed '4d' test1.txt
删除第1到3行的数据:
sed '1,3d' test1.txt
删除第2行到最后一行的所有数据:
sed '2,$d' test1.txt
删除含有天津的行:
sed '/天津/d' test1.txt