1 sed 流编辑器
1.1 什么是sed?
流编辑器 是用来从文件读取文本或者从管道实现基本的变化。结果送到标准输出。 sed 命令的语法不指定输出文件,但是结果可以通过使用输出重定向来写入到文件中。编辑器并不改变原来的文件。
sed 和其它编辑器比如 vi 和 sed的区别在于它能够过滤来自管道的输入。在编辑器运行的时候你不要去干涉它;所以 sed常常被称作 批编辑器 。此特性允许你在脚本中使用编辑命令,极大的方便了重复性编辑任务。当面对文件中大量的文本替换的时候, ed 将是一个极大的帮助。
1.2 sed命令
a/ 在当前行后面增加文本。
c/ 用新的文本替换当前行。
d 删除文本。
i/ 在当前行之前插入文本。
p 打印文本。
r 读取一个文件。
s 搜索并且替换文本。
w 写入一个文件。
1.3 打印包含pattern的行
sed -n '/pattern/p' filename
1.4 删除包含pattern的行
sed '/pattern/d' filename
1.5 行的范围
sed '2,4' filename
sed '3,$d' filename
1.6 查找替换
sed 's/pattern1/pattern2/g' filename
1.7 多个查找替换命令用单独选项 -e 来隔开
sed -e 's/pattern1/pattern2/g' -e 's/pattern3/pattern4/g' filename
1.8 输出保存到文件,使用重定向
sed '3,$d' filename > new_filename
1.9 练习
- 打印在你 scripts 目录中的文件列表,用 “.sh” 来结尾。注意你可能需要unalias ls。把结果放入一个临时文件。
- 完成一张文件列表:包含了在 /usr/bin 中且第二个字符是 “a” 的文件,把结果放入一个临时文件。
- 删除每个临时文件的最初3行。
- 把仅包含 “an” 的行打印到标准输出。
- 建立一个包含 sed 命令的文件来完成之前的两个任务。在这个文件中加入一个额外的命令使得在以字符串 “man” 开始的每行加入一个例如 “*** This might have something to do with man and man pages ***” 的字符串。检查结果。
- 一个稍长的根目录的列表 /,用于输入。建立一个包含 sed 命令的文件来检查符号连接和纯文本文件。如果一个文件为符号连接,用类似 “--This is a symlink--” 这样的一行开始。如果文件是纯文本,在同一行上加入字符串,加入一个类似 “<-- this is a plain file” 的注释。
- 建立一个从文件中显示包含空格的脚本。这个脚本应该使用一个 sed 脚本来向用户显示明显的信息。
1.10 答案
ls /usr/bin | sed -n '/(^.a.*)/p'
特别解释一下:
a*与a.*的区别,a*表示匹配a,aa,aaa,aaaa-–,而a.*表示匹配a后的任意多个字符,如aa,ab,acgx0
a.*b$ 匹配 a 和 b 中间有任何字符的情况
a*b$ 匹配 a 和 b 中间有任意个a的情况
1.11 字符元集
^
锚定行的开始 如:/^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的行。