Sed编辑器
前面我们介绍了普通的交互式编辑器(Vim),可以通过键盘命令来交互式插入、删除、或替换文本中的数据,这儿会在解说Linux中两个广泛使用的命令行编辑器:sed和gawk;能够轻松实现自动化格式化、插入、修改、删除文本等;
1. Sed编辑器基础
又称为流编辑器(Stream editor),通过处理数据前基于事先提供的一组规则来编辑数据流;
sed编辑器可以通过命令来处理数据,这些命令来自:
- 命令行输入
- 命令文本文件
编辑器执行的流程:
- 一次读取一行数据
- 根据提供的编辑器命令匹配数据
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
有多少行数据,就重复这个流程多少次;
sed命令格式:
sed options script file
script指定了用于数据流的单个命令,如果需要多个命令要么使用-e选项在命令行中指定,要么使用-f选项在单独的文件中指定;
1. 在命令行定义编辑器命令
-
默认情况下,编辑器会将指定的命令应用到STDIN输入流上,可以直接将数据通过管道符(|)输入编辑器处理;如:
echo “this are leslie” | sed '/s/are/is/'
这儿只是修改了一行,如果要修改多行,我们可以指定文本文件;这里的s命令是编辑器替换文本命令,后面会讲解,用第二个文本替换前一个文本;
***在命令行使用多个编辑器命令:***使用-e选项;命令之间必须用分号隔开,并且命令末尾和分号之间不能有空格;除此之外还有一种方式使用次提示符(>):输入第一个单引号(’)表示sed程序脚本的起始,在命令结束所在行有单引号标识结束
2. 从文本中读取编辑器命令
使用-f选项来指定编辑器命令文本,为了避免sed编辑器命令脚本文件bash shell脚本文件搞混,我们可以使用.sed作为其扩展名
1.1.1 替换命令-s
语法格式:
s/被替换文本/替换文本/
1.1.1.1 替换标记
上面我们说了替换命令s使用,假入在一行中要全部替换出现的那个文本,而s命令只会替换出现的第一处;如:
echo “this is leslie,leslie” | sed 's/leslie/lin/'
这儿就是会替换这一行第一个"leslie"文本,如果要替换多处,需要在替换字符串后添加替换标记:
echo “this is leslie,leslie” | sed 's/leslie/lin/替换标记'
替换标记有四种:
- 数字:将第几处匹配的文本替换为指定的新文本
- g:替换所有匹配的文本地方
- p:打印匹配行对应原先的行内容,通常与-n选项:(禁止编辑器输出)一起使用;
- w file :将替换的结果写入文件(只会将匹配的行,修改后写入文件)
如果我们替换的文本中路径名,这时可能就会有问题,替换命令中我们(/)作为字符串分隔符,这时我们就必须对路径名中(/)进行转义:
sed 's/\/bin\/bash\/bin\/csh/' /etc/passwd
也可以选择其他字符来作为字符串分隔符,比如这里我们使用感叹号作为分隔符
sed 's!/bin/bash!/bin/csh!' /etc/passwd
1.1.2 地址
地址的作用就是将命令作用吧与指定行;
默认情况下,sed编辑器命令作用于文本数据的所有行;
行地址放在编辑器命令前;
如:
sed '3s/lin/leslie/' test
如果是将行地址对应的进行多个命令
sed 地址{命令1
命令2...}
有两种表示寻址行的方式:
1. 数字形式表示区间
如果是单行,直接指定对应行数既可,如果是一个区间:起始行,结束行
行:可以使单行(N)、行区间(起始行,结束行)、起始行到文本结束(其实行,$)
前者使用:
单行:sed ‘3/s/被替换/替换’ 文件
行区间: sed ‘1,3/s…’…
起始行到文尾: sed ‘2,$/s/…’
后者使用:
sed '2,${
s/被替换/替换
s/被替换/替换
.....
}' 文件
2. 文本模式过滤行
格式:
/文本模式/命令
除了使用固定文本过滤,sed编辑器在文本模式中还可以采用 正则表达式(下一篇将会讲到)来实现更好的匹配模式效果;
1.1.3 删除行命令-d
会删除指定寻址模式的所有行,如果为加寻址模式,表示删除所有的行;文本文件行数太多,我们不可能去一行一行的数,用“$”表最后一行;
sed 'd' test
这儿没有指定行地址,会删除所有行,如果要删除特定行:
sed '2,$d' test
这儿会删除第二行到行末;
或者可可以他通过文本匹配删除行:
sed '/this/d' test
1.1.4 插入(insert)、追加(append)文本
在指定行前插入新的一行或者在指定行后追加新的一行;
插入命令:i
追加命令:a
格式:
[]:表示可以可有可无,这儿如果不指定行地址,表示对所有行执行命令
sed '[行地址]命令\
追加或者插入的新行' [文本文件件]
这个命令不能在单个命令行使用;
***注意:***插入行或者追加行,不能使用行地址区间;
前面我们说了,多行文本最后一行行地址用“$”表示;如:在文本末尾追加一行:
1.1.5 修改行
c命令格式:
sed '行地址c\
修改行文本' 文本文件
1.1.6 转换命令(y)
转换(transform)命令(y)是唯一一个可以处理单个字符的sed编辑器命令;
格式:
sed 地址y/inchars/outchars/
转换命令会对inchars和outchars值进行一对一映射;第一个字符会被转换为outchars的第一个字符,第二个字符会被转换为outchars的第二个字符,以此类推…如果两者长度不一样,就会产生一条错误消息;
1.1.7 sed编辑器的三个打印命令
- p命令打印文本行
- 等号(=)打印行号
- l命令列出行
1.1.8 sed处理文件
1.1.8.1 写入文件命令(w)
用来向文件中写入行
格式:
[地址]w 写入的文件的路径
关于路径可以是绝对路径也可以是相对路径,运行编辑器的用户都必须有该文件的写权限;
1.1.8.2 读入文件命令®
将文件中的数据读入指定位置对应的数据流;
2. Sed编辑器高级部分
打印行号
3. l命令列出行
1.1.8 sed处理文件
1.1.8.1 写入文件命令(w)
用来向文件中写入行
格式:
[地址]w 写入的文件的路径
关于路径可以是绝对路径也可以是相对路径,运行编辑器的用户都必须有该文件的写权限;
1.1.8.2 读入文件命令®
将文件中的数据读入指定位置对应的数据流;