sed介绍

1、sed介绍

    sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

2、sed工作原理

    sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

3、正则表达式概念

    在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具,换句话说,正则表达式就是记录文本规则的代码。许多程序设计语言都支持利用正则表达式进行字符串操作。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

4、正则表达式的匹配过程

    简单描述一下正则表达式的匹配过程,就是拿正则表达式所表示的字符串去和原文字符串内容去匹配,直到匹配到原文内容字符串中的一个完整子串就表示匹配成功。举个例子,有一行文件内容"this is better desk",这里用"esk"去匹配,匹配过程是这样的:首先拿e去匹配文件行内容,从this开始,直到better的e,第一个字符匹配成功,接着s去匹配better字符e后边的t字符,没有匹配成功;然后重新拿esk中的e去和better的第二个t去匹配,没有成功,接着原始内容的下一个字符,直到desk中的e字符,逐个匹配s,k字符,到此为止,esk成功匹配,正则表达式匹配完毕,整个过程就是这样,即使再复杂的正则表达式的匹配过程也是按照此过程来进行的。

5、sed语法和常用选项

sed [选项] ‘command’ 文件名称 选项部分,常见选项包括-n,-e,-i,-f,-r选项。 command部分包括:[地址1,地址2] [函数] [参数(标记)]

参数说明:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或--help 显示帮助。 -n或--quiet或--silent 仅显示script处理后的结果。 -V或--version 显示版本信息。 动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何东东; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!   

实例 我们先创建一个 testfile 文件,内容如下:

$ cat testfile #查看testfile 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test Google Taobao Runoob Tesetfile Wiki 在 testfile 文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:

sed -e 4a\newLine testfile 使用 sed 命令后,输出结果如下:

$ sed -e 4a\newLine testfile HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test newLine Google Taobao Runoob Tesetfile Wiki 以行为单位的新增/删除 将 testfile 的内容列出并且列印行号,同时,请将第 2~5 行删除!

$ nl testfile | sed '2,5d' 1 HELLO LINUX!
6 Taobao 7 Runoob 8 Tesetfile 9 Wiki sed 的动作为 2,5d,那个 d 是删除的意思,因为删除了 2-5 行,所以显示的数据就没有 2-5 行了, 另外,原本应该是要下达 sed -e 才对,但没有 -e 也是可以的,同时也要注意的是, sed 后面接的动作,请务必以 '...' 两个单引号括住喔!

只要删除第 2 行:

$ nl testfile | sed '2d' 1 HELLO LINUX!
3 This is a linux testfile!
4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki 要删除第 3 到最后一行:

$ nl testfile | sed '3,$d' 1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
在第二行后(即加在第三行) 加上drink tea? 字样:

$ nl testfile | sed '2a drink tea' 1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
drink tea 3 This is a linux testfile!
4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki 如果是要在第二行前,命令如下:

$ nl testfile | sed '2i drink tea' 1 HELLO LINUX!
drink tea 2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki 如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ..... 与 drink beer?

$ nl testfile | sed '2a Drink tea or ......
drink beer ?'

1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
Drink tea or ...... drink beer ? 3 This is a linux testfile!
4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki 每一行之间都必须要以反斜杠 \ 来进行新行标记。上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。

以行为单位的替换与显示 将第 2-5 行的内容取代成为 No 2-5 number 呢?

$ nl testfile | sed '2,5c No 2-5 number' 1 HELLO LINUX!
No 2-5 number 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki 透过这个方法我们就能够将数据整行取代了。

仅列出 testfile 文件内的第 5-7 行:

$ nl testfile | sed -n '5,7p' 5 Google 6 Taobao 7 Runoob 可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示 搜索 testfile 有 oo 关键字的行:

$ nl testfile | sed -n '/oo/p' 5 Google 7 Runoob 如果 root 找到,除了输出所有行,还会输出匹配行。

数据的搜寻并删除 删除 testfile 所有包含 oo 的行,其他行输出

$ nl testfile | sed '/oo/d' 1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test 6 Taobao 8 Tesetfile 9 Wiki 数据的搜寻并执行命令 搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk,再输出这行:

$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'
5 Gkkgle 最后的 q 是退出。

数据的查找与替换 除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的查找与替换<。

sed 的查找与替换的与 vi 命令类似,语法格式如下:

sed 's/要被取代的字串/新的字串/g' 将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:

sed -e 's/oo/kk/' testfile g 标识符表示全局查找替换,使 sed 对文件中所有符合的字符串都被替换,修改后内容会到标准输出,不会修改原文件:

sed -e 's/oo/kk/g' testfile 选项 i 使 sed 修改文件:

sed -i 's/oo/kk/g' testfile 批量操作当前目录下以 test 开头的文件:

sed -i 's/oo/kk/g' ./test* 接下来我们使用 /sbin/ifconfig 查询 IP:

$ /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略)..... 本机的 ip 是 192.168.1.100。

将 IP 前面的部分予以删除:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 接下来则是删除后续的部分,即:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。

将 IP 后面的部分予以删除:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.addr://g' | sed 's/Bcast.$//g' 192.168.1.100 多点编辑 一条 sed 命令,删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 RUNOOB :

$ nl testfile | sed -e '3,$d' -e 's/HELLO/RUNOOB/' 1 RUNOOB LINUX!
2 Linux is a free unix-type opterating system.
-e 表示多点编辑,第一个编辑命令删除 testfile 第三行到末尾的数据,第二条命令搜索 HELLO 替换为 RUNOOB。

直接修改文件内容(危险动作) sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由于这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!

regular_express.txt 文件内容如下:

$ cat regular_express.txt runoob. google. taobao. facebook. zhihu- weibo- 利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

$ sed -i 's/.$/!/g' regular_express.txt $ cat regular_express.txt runoob! google! taobao! facebook! zhihu- weibo- :q:q

利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

$ sed -i '$a # This is a test' regular_express.txt $ cat regular_express.txt runoob! google! taobao! facebook! zhihu- weibo-

This is a test

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test!

sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

大家快来一起学习 文本处理工具sed,缺乏机器练手的小伙伴可以去 cnaaa 看一看!

点赞
收藏

评论区

加载中...

相关推荐

Linux 三剑客之 grep 使用详解

Linux最重要的三个命令在业界被称为三剑客,它们是:awk、sed、grep。sed已经在上篇(https://mp.weixin.qq.com/s/XvTrfKfYZHnGZQ1O1K9lg)中讲过,本文要讲的是grep命令。我们在使用Linux系统中,grep命令的使用尤为频繁,熟练掌握grep的常见用法,能够极大地提高你的

Linux Shell编程 sed命令

概述sed是一种几乎可以应用在所有UNIX平台(包括 Linux)上的轻量级流编辑器,体积小。所以,它可以对从如管道这样的标准输入中接收的数据进行编辑。 sed主要是用来将数据进行选取、替换、删除、新増的命令。我们看看命令的语法:root@localhost~sed选项'动作'文件名选项:

SHELL编程四剑客之Sed工具

SED是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本。Sed工具在处理文本时默认把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace)。如果要将变化写入磁盘、文件需要使用i参数。sed命令语法参数格式:sed参数‘sed内置命令字符‘

vim文本编辑器

vim文本编辑器:文本编辑器:文本:纯文本,ASCIItext;unicode;文本编辑种类:1.行编辑器:sed2.全屏编辑器:nano,vivi:visualinterfacevim:viIMprovedvim:模块化的编辑器基本模

Linux sed命令

简介sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多

25道Shell面试题

1、用sed修改test.txt的23行test为tset;sed–i‘23s/test/tset/g’test.txt2、查看/web.log第25行第三列的内容。sed–n‘25p’/web.log|cut–d“”–f3head–n25/web.log|tail–n1|