现在的位置: 首页 > 综合 > 正文

sed 命令详解

2017年12月21日 ⁄ 综合 ⁄ 共 1757字 ⁄ 字号 评论关闭

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 练习

  1. 打印在你 scripts 目录中的文件列表,用 “.sh” 来结尾。注意你可能需要unalias ls。把结果放入一个临时文件。
  2. 完成一张文件列表:包含了在 /usr/bin 中且第二个字符是 “a” 的文件,把结果放入一个临时文件。
  3. 删除每个临时文件的最初3行。
  4. 把仅包含 “an” 的行打印到标准输出。
  5. 建立一个包含 sed 命令的文件来完成之前的两个任务。在这个文件中加入一个额外的命令使得在以字符串 “man” 开始的每行加入一个例如 “*** This might have something to do with man and man pages ***” 的字符串。检查结果。
  6. 一个稍长的根目录的列表 /,用于输入。建立一个包含 sed 命令的文件来检查符号连接和纯文本文件。如果一个文件为符号连接,用类似 “--This is a symlink--” 这样的一行开始。如果文件是纯文本,在同一行上加入字符串,加入一个类似 “<-- this is a plain file” 的注释。
  7. 建立一个从文件中显示包含空格的脚本。这个脚本应该使用一个 sed 脚本来向用户显示明显的信息。

1.10 答案

  1. 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的行。

抱歉!评论已关闭.