1. Sed简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
3. Sed命令
调用sed命令有两种形式:
*
sed [options] ‘command‘ file(s) { conmand为 /PATTERN/ACTION }
*
sed [options] -f scriptfile file(s)
a\
在当前行后面加入一行文本。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。 (模式空间 到 保持空间)
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
*
g表示行内全面替换。
*
p表示打印行。
*
w表示把行写入一个文件。
*
x表示互换模板块中的文本和缓冲区中的文本。
*
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
4. 选项
-e command, --expression=command
允许多台编辑。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-i 参数
直接在原文件上进行操作
-f, --filer=script-file
引导sed脚本文件名。
-V, --version
打印版本和版权信息。
5. 元字符集(\表示转义)
^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
6.sed程序实例
1. 给文件中每行的结尾添加一行空行;
解释:上面讲到 sed工具的使用格式 sed -[op] ‘ / 正则表达式/操作‘ file
当正则表达式为空时 说明匹配所有行,G 表示 将保持空间的内容 追加到模式空间。
保持空间默认有空行,因此该命令为 每行文本末添加了空行
若 -[op]为 -i 则sed所做的 编辑 会 写入 源文件
2. 用sed模拟tac功能
解释:方法一 :为除第一行 每次将保持空间内容追加进模式空间;
然后整体拷贝进保持空间;
最后一行时 打印模式空间内容。
方法二 :为除第一行 每次将保持空间内容追加进模式空间;
然后整体拷贝进保持空间;
除最后一行 删除模式空间内容 这时 会打印模式空间内容
注意:action并不是只有一个 可以同时按序执行多个action 需用 ‘ ; ’隔开
3. 追加匹配行到文件结尾
逻辑:将匹配行 追加进 保持空间 到最后一行时 从保持空间 追加 进模式空间
4. 行列转化
分析:行列转换 实质为 将 ’\n‘ 与 ’自定义的 列分隔符 ‘相互 替换
因为如果要转换则模式空间中至少要有一行以上的数据,因此可以每读入一行数据到模式空间的时候都将其追加到保持空间,当处理到最后一行的时候将模式空间与保持空间的内容交换,这时候模式空间里面就是file的内容,然后再进行整体的将‘\n’替换成空格;
5. 1~100求和
出从1到指定数字的序列,之后将序列交给sed,首先将每一行都追加到保持空间内,如果是最后一行则交换保持空间和模式空间的内容,这时候再对交换后模式空间的内容进行处理,将所有的‘\n’都替换为‘+’,之后再交给bc计算工具处理就可以了;
:a可以看做是一个标签,N表示不断地读入并且将其追加到模式空间内,ba表示跳到标签处,也就是如果不是最后一行就不断地读读读直到最后一行也被追加进来的时候,模式空间的内容就是序列的内容,此时再进行整体的将‘\n’替换成‘+’,同样的,将其交给bc计算出和;
6. 打印奇数行和偶数行
对于N来说是读入下一行追加到模式空间,而n则是读入下一行并且拷贝到模式空间,这里拷贝就会将模式空间原来的值覆盖掉,因此,先进行n再进行p操作打印出的就是偶数行,而先进行p操作再进行读入拷贝打印出的就是奇数行;(输出奇数行 时 ’p;N‘ 与 ’p;n‘ 结果一致 )