流编辑 -- sed

小Q:有一种隐忍其实是蕴藏的最大力量,有一种静默其实是最惊天的告白。

=============================================================

一:简介

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

二:命令格式
sed   [options]   ‘command‘  file(s)       #直接调用选项和命令
sed   [options]   -f  filename  file(s)       #调用文件中的语句

三:选项[options]+命令command

常用选项:

-n∶使用安静(silent)模式。加上 -n ,只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。

常用参数:(+不常用)

a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

四:入门实例 打印 删除 替换  查找 (n p d s g)
     sed -n ‘1p‘ file             #显示第一行
     sed -n ‘$p‘ file              #显示最后一行
     sed -n ‘1,2p‘ file             #显示第一行到第二行
     sed -n ‘2,$p‘ file               #显示第二行到最后一行
     sed ‘/^$/‘ file                 #删除file文件的空白行
     sed ‘1d‘ file                   #删除第一行
     sed ‘$d‘ file                     #删除最后一行
     sed ‘2,$d‘ file                    #删除第二行到最后一行
     sed ‘s/book/books/‘ file       #替换单独的字符串
     sed -n ‘s/test/TEST/p‘ file       #-n打印只发生替换过的行
     sed ‘s/book/books/g‘ file        #替换每一行中所有匹配
     echo sksksksksksk | sed ‘s/sk/SK/3g‘ skskSKSKSKSK  #从第三处开始替换
     sed -n ‘/ruby/p‘ file             #查询包括关键字ruby所在所有行
     sed -n ‘/\$/p‘  file             #查询包括关键字$所在所有行,\消义符

当然这些命令操作只是把想要的打印出来,不会真的改变文件中的内容,想要真正改变内容,需要加 -i 选项

五:命令详解

多点编辑:e命令   

-e选项允许在同一行里执行多条命令:
sed -e  ‘1,5d‘   -e ‘s/test/check/‘   file
#上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
和 -e 等价的命令是 --expression:
sed --expression=‘s/test/check/‘ --expression=‘/love/d‘ file
从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed   ‘/test/r  file‘   filename
写入文件:w命令
在example中所有包含test的行都被写入file里:
sed -n ‘/test/w file‘ example
追加(行下):a\命令
将 this is a test line 追加到 以test 开头的行后面:
sed   ‘/^test/a\this is a test line‘    file   在 test.conf
文件第2行之后插入 this is a test line:
sed -i  ‘2a\this is a test line‘  test.conf
插入(行上):i\命令
将 this is a test line 追加到以test开头的行前面:
sed ‘/^test/i\this is a test line‘ file
在test.conf文件第5行之前插入this is a test line:
sed -i ‘5i\this is a test line‘ test.conf
下一个:n命令
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:
sed ‘/test/{ n; s/aa/bb/; }‘ file
变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:
sed ‘1,10y/abcde/ABCDE/‘ file
退出:q命令
打印完第10行后,退出sed

sed ‘10q‘ file
保持和获取:h命令和G命令
在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
sed -e ‘/test/h‘ -e ‘$G‘ file

在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:
 sed -e ‘/test/h‘ -e ‘/check/x‘ file

脚本scriptfile sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
sed [options] -f scriptfile file(s)
打印奇数行或偶数行
方法1:

sed -n ‘p;n‘ test.txt #奇数行
sed -n ‘n;p‘ test.txt #偶数行
方法2:
sed -n ‘1~2p‘ test.txt #奇数行
sed -n ‘2~2p‘ test.txt #偶数行
打印匹配字符串的下一行

grep -A 1 SCC URFILE sed -n ‘/SCC/{n;p}‘ URFILE awk ‘/SCC/{getline; print}‘ URFILE
定界符
以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符: sed ‘s:test:TEXT:g‘ sed ‘s|test|TEXT|g‘
定界符出现在样式内部时,需要进行转义:
sed ‘s/\/bin/\/usr\/local\/bin/g‘
已匹配字符串标记&

正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:

echo this is a test line | sed ‘s/\w\+/[&]/g‘

[this] [is] [a] [test] [line]

所有以192.168.0.1开头的行都会被替换成它自已加localhost:

sed ‘s/^192.168.0.1/&localhost/‘ file

192.168.0.1localhost

子串匹配标记\1

匹配给定样式的其中一部分:

echo this is digit 7 in a number | sed ‘s/digit \([0-9]\)/\1/‘

this is 7 in a number

命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,\(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2,

例如: echo aaa BBB | sed ‘s/\([a-z]\+\) \([A-Z]\+\)/\2 \1/‘             BBB aaa love

被标记为1,所有loveable会被替换成lovers,并打印出来:

sed -n ‘s/\(love\)able/\1rs/p‘ file

组合多个表达式

sed ‘表达式‘ | sed ‘表达式‘ 等价于: sed ‘表达式; 表达式‘

引用 sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。 test=hello

echo hello WORLD | sed "s/$test/HELLO"                      HELLO WORLD

选定行的范围:,(逗号) 所有在模板test和check所确定的范围内的行都被打印:

sed -n ‘/test/,/check/p‘ file

打印从第5行开始到第一个包含以test开始的行之间的所有行:

sed -n ‘5,/^test/p‘ file

对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换:

sed ‘/test/,/west/s/$/aaa bbb/‘ file

----------------------------------------------------------------------------------------------------

推荐大家阅读:http://blog.chinaunix.net/uid-25324849-id-3190054.html

http://blog.csdn.net/yiqingnian28/article/details/23133043

时间: 2024-08-14 19:19:38

流编辑 -- sed的相关文章

sed 一 流编辑

简介 sed 采用的是流编辑模式: 最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据. sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中. 此命令执行数据的顺序如下: 1. 每次仅读取一行内容.根据提供的规则命令匹配并修改数据. 注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据: 2. 将执行结果输出. 3. 当一行数据匹配完成后,它会继续读取下一行数据

Shell 基础 -- 流编辑器 sed 详解

一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多,可以快速完成对数据的编辑修改. 一般来说,sed 编辑器会执行以下操作: 1)一次从输入中读取一行数据: 2)根据所提供的编辑器命令匹配数据: 3)按照命令修改流中的数据: 4)将新的数据输出到 STDOUT. 在 sed 编辑器匹配完一行数据后,它会读取下一行数据并重复这个过程,直到处理完所有数据

流编辑器Sed

Sed简介 Sed是一款流编辑工具,用来对文本进行过滤与替换操作,特别是当你想要对几十个配置文件做统一修改时,你会感受到Sed的魅力!Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件.首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即

流编辑器sed使用总结及利用sed从文本中提取字符串的方法

sed 是一个编辑器,但它与其它大多数编辑器不同.除了不面向屏幕之外,它还是非交互式的,我们常用的vim编辑器则是交互式的. 这意味着必须将要对数据执行的命令插入到命令行或要处 理的脚本中.sed 在一个文件(或文件集)中非交互式.并且不加询问地接收一系列的命令并执行它们.因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器,可以对文件或者文件集批量的进行删除 替换 插入 追加等操作. 流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间. 其参数可能

shell脚本学习笔记 (流编辑器sed)

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不只支持正則表達式.它另一些比較厉害的功能. 我给出一个样例,大家看看有什么办法能够解决它吧. <html><head><title>Hello World</title> <body>Welcome to the world of regexp!&l

流编辑器 SED 十分钟入门全教程

这里借用一下酷壳网sed博文的图来开题,超赞的-- 1. sed 简介及原理简析 1.1 sed 简介 Sed 是什么?相信很多人都有所了解,sed 全称StreamEDitor 即流编辑器.生于1973年or 1974年by 贝尔实验室的 Lee E. McMahon(已故),是基于交互式编辑器ed("editor", 1971)的脚本功能及更早的qed(quick editor ,1965-1966)(Sed 比 awk 要大那么几岁,所以客官莫急,过几天我们再来详解 awk).S

我最爱的流编辑器sed用法总结

[替换]s 1 sed'/mislost/long/g' filename 在sed中,文件的每一行都会作为输入传入到sed中,如果不加g那么上述列子中只会替换每一行 第一个匹配到的mislost.加g则会匹配一行中所有的mislost. 想要定位一个行,然后去匹配需要这样做 1 sed'/test/s/mislost/long/g' filename 如果这一行包含有test,则将mislost替换为long 在例子中,/test/ 就是一个地址,sed在做操作的时候可以指定0个,1个或者2个

文本处理三剑客之sed流编辑器

流编辑器 sed 模式空间,默认不编辑原文件,仅对模式空间中的数据做处理:处理结束后,将模式空间中数据打印至屏幕.sed是一个行编辑器. sed [options] 'Address Command' file ... Option: -n: 静默模式, 不再默认显示模式空间中的内容-i: 直接修改原文件-e SCRIPT 可以同时执行多个脚本, 操作-f /PATH/TO/SED_SCRIPT  如: sed -f /path/to/scripts file ( 指定 sed 的脚本文件)-r

Linux基础之sed流编辑器详解

之前介绍了三大文本编辑器的grep,这里介绍比grep功能更强的sed流编辑器 sed是什么? sed是Stream EDitor的缩写,man中对sed的简洁为 sed - stream editor for filtering and transforming text 它的主要功能是对文本的过滤与替换. sed的工作原理 sed的工作过程:sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果