linux中sed命令的使用

  最近需要造一个大容量的文本文件,发下sed工具就是对文本文件操作的,故学习一下。

  sed是一个非交互式的文本编辑器,它可对文本文件和标准输入进行编辑。

  标准输入有以下来源:

    • 键盘输入
    • 文件重定向
    • 字符串
    • 变量
    • 管道

  sed从文本的一个文本行或标准输入读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号编辑,重复此过程直至命令行或脚本中的所有命令结束。

  相对于vi编辑器,它的执行效率高,可以一次性处理所有编辑任务。sed的使用场合如下:

    • 编辑相对交互式编辑器而言太大的文件;
    • 编辑命令太复杂,在交互式编辑器中难以输入;
    • 需要执行多个函数才能完成对文件的扫描

  可以通过3种方式调用sed命令:

  1. 在命令行输入命令调用sed,格式:sed [选项] 'sed命令' 输入文件;
  2. 将sed写入脚本,然后通过sed命令调用 格式:sed [选项] -f sed脚本文件 输入文件;
  3. 将sed写入脚本,并设置为可执行脚本。

      不管哪种调用方式,如果没有指定输入文件,将从标准输入中接收数据,sed常用的选项如下:

选项                                                      意义
-n 不打印所有行到标准输出
-e 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,该选项可以省略
-f 表示正在调用sed脚本

sed通常由定位文本行和编辑命令组成,编辑命令对定位文本行进行处理,sed提供了两种定位文本的方式:

    • 使用行号,指定一行或行范围;
    • 使用正则表达式。

sed定位文本的方式:  

选项 意义
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 查询从匹配行到x行之间的行
x,/pattern/ 查询从x行到匹配行之间的行
x,y! 查询不包括x和y行号的行

sed编辑命令:

选项 意义
p 打印匹配行
= 打印文件行号
a\

在定位行号之后追加文本信息

i\ 在定位行号前插入文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式
r 从另一个文本中读取
w 将文本写入到文件中
y 变换字符
q 第一个模式匹配完成后退出
l 显示与八进制ASCII码等价的控制符
{} 在定位行执行的命令组
n 读取一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H 将模式缓冲区的文本追加到保持缓冲区
x 互换模式缓冲区与保持缓冲区的内容
g 将保持缓冲区的内容复制到模式缓冲区
G 将保持缓冲区的内容追加到模式缓冲区

下面举一些例子:

新建一个文本 test.sh.输入如下内容:

hello world
I want to find the good person
best wishes
spal xiang
welcome to my home

Do you want a pensel?yes,I want one.

1.sed -n '1p' test.sh --打印输入文件的第一行

2.sed -n '/world/p' test.sh --打印输入文件中与world文本匹配的行

3.sed -n '3,6p' test.sh --打印输入文件的3,6行

4.sed -n -e '/world/=' -e '/world/p' test.py --打印输入文件中与world匹配的行号和内容,编辑命令不能组合使用

#这里“=”将匹配的行号输出,“p”指讲匹配的行内容输出,“-n”指不打印所有内容,只打印匹配到的,/world/指查询包含world的行 -e后面的字符串为编辑命令

5.sed '/world/a\I am adding a new line' test.py --在指定位置追加内容,可以通过匹配或行号方式指定位置

6.追加内容也可以通过脚本add.sed的方式实现:

  #!/bin/sed -f

  /world/a\ 

  I am adding a new line, \

  I am add another line.

  给脚本add.sed赋执行权限,执行./add.sed test.sh即可。

7.sed -n '/\?/p' test.sh --打印匹配元字符?的行,输入文件中含有元字符的需要用"\"转义。

8.sed -n '$p' test.sh --打印输入文件的最后一行。

9.sed -n '3,$p' test.sh --打印第三行到最后一行的内容。

10.sed -n '/.*ome/p' test.sh --打印以ome结尾的行。

11.sed -n '3,6!p' test.sh --打印不在3,6行的内容,!不能与模式匹配结合使用。

12.sed '/world/i\I am insert into a new line to this file' test.sh --插入文本,在匹配的行前面插入内容,脚本调用方式和a\类似。

13.sed '/world/c\I am replace this line now' test.sh --修改匹配到的文本行,脚本调用方式和a\类似。

14.sed '/world/d' test.sh --删除匹配的文本行。

15.sed '3,$d' test.sh--删除文本第3行到最后一行。

16.sed '/[wW][oO][Rr][lL][Dd]/d' test.py --删除world匹配到的包含大小写的所有行

17.sed 's/world/Beijing/g' test.py --替换文本,与修改c\的区别是s\修改的是字符串,而不是整行,该选项可以结合g p w灵活替换,不加g时只替换每一行第一个匹配到的字符串。

18.sed -n 's/world/faimly/2p' test.py --可以指定每一行中第几次匹配到的字符串替换。

19.sed -n 's/world/faimly/1w test.bat' test.sh --替换第一个匹配到的字符串,并将替换行输出到test.bat中。

20.sed -n 's/world/(&)/p' test.py --&代表被匹配的字符串。

21.sed -n '1,5 w test.bat' test.py --将指定范围的行输出到新文件。

22.sed -n '/.r.*/p' test.py --匹配字符串中含有r的行。

23.sed -n '/.r.*/q' test.py --q指只要匹配到指定的字符串的行就退出。

24.sed -n '1,$l' test.py --显示输入文件中的控制字符。

25.sed -n '/world/{=;p}' test.py --{}内存放编辑命令组。

26.sed -n '/world/{s/he/11/p;s/th/22/pg}' test.sh --替换与world匹配的行中的he为11,th为22。

27.sed '/world/{n;s/want/have/g;}' test.sh --匹配到输入文件中含有world的行,然后替换该行的下一行中的want为have。

还有一些关于模式缓冲区和保持缓冲区内容复制,追加,切换的命令,这里就不一一举例了。

posted @ 2017-02-10 15:48  confident1012  阅读(545)  评论(0编辑  收藏  举报