sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

语法

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

选项(options)

-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
-h或--help:显示帮助;
-n或--quiet或——silent:仅显示script处理后的结果;
-V或--version:显示版本信息。
-i:直接修改文件内容

Sed命令

a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。

Sed替换标记

g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\ 子串匹配标记
& 已匹配字符串标记

Sed元字符集

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*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次,如:/\{\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/\{,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/\{,\}/匹配5~10个0的行。

删除(d)

删除第x行
sed -e 'xd' inputfile
删除第x1,x2,x3行呢
sed -e 'x1d' -e 'x2d' -e 'x3d' inputfile
#删除第n行到第m行
sed -e 'n,md' file
#删除第一行到最后一行
sed -e '1,$d' file #$ 最后一行和一行的最后
#删除含有字母xx的行
sed -e '/xx/d' file
#删除除含有字符串xx的所有行
sed -e '/xx/!d' file
#删除从含有单词word1到含有单词word2的行
sed -e '/word1/, /word2/d' file
#删除文件中从第10行到含有word1的行
sed -e '10,/word1/d' file
#删除从含有word1的行到第10行
sed -e '/word1/,10/d' file
#删除含有两个t的行
sed -e '/t.*t/d' file
#类似可删除含有指定正在表达式匹配的行。

替换(s、c)

  Sed 可替换文件中的字串、资料行、甚至资料区。其中,表示替换字串的指令中的函数参数为s;表示替换资料行、或资料区>的指令中的函数参数为c。上述情况以下面三个例子说明。

#行的替换:
#把第一行替换成#!/bin/more
sed -e '1c/#!/bin/more' file
#把第n行替换成just do it
sed -e 'nc/just do it' file
#把1到10行替换成一行:I can do it
sed -e '1,10c/I can do it' file
#一行替换成两行(I can do it! Let's start)
sed -e '1,10c/I can do it!/nLet'"/'"'s start' file
#字符的替换:
#将每一行的word1单词替换成word2
sed -e 's/word1/word2/' file #s参数最多与两个位置参数相结合
#函数参数s中有两个特殊的符号:
#& : 代表pattern
#/n : 代表 pattern 中被第 n 个 /( 、/)(参照[附录 A]) 所括起来的字串。例如
sed -e 's/w1/& w2/' file # w1的地方输出 w1 w2
sed -e 's//(test/) /(my/) /(car/)/[/2 /3 /1]/' file #结果: [my car test]
#flag 参数举例
sed -e 's/w1/& w2/g' file
#g : 代表替换所有匹配项目;这里,文件中所有字符串w1都会被替换成字串w1 w2
sed -e 's/w1/& w2/10' file
#m() : 替换行内第m个符合的字串; 记住,是行内的第m个匹配的字串
sed -e 's/w1/& w2/p' file
#p : 替换第一个和w1匹配的字符串为w1 w2,并输出到标准输出.
sed -e 's/w1/& w2/w w2file' file
#w filename : 该参数会将替换过的内容写入到文件w2file并输出替换后的整个文件。注意w2file里写的只是替换过的行。
sed -e 's/w1/& w2/' file
#这里的flag 为空, 这样就只是将第一个w1匹配的字符串替换成w1 w2而后面的不进行替换。
#位置参数应用举例
sed -e '/machine/s/phi/beta/g' file
#将文件中含"machine"字串的资料行中的"phi"字串,替换成为"beta"字串
sed -e '1,10 s/w1/& w2/g' file
#把1到10内的w1字符串替换成w1 w2字符串。
sed -e '1,/else/ s/w1/& w2/g' file
#把1到字符串else内的w1字符串替换成w1 w2字符串。
echo sksksksksksk | sed 's/sk/SK/2g'
#从第N出开始替换skSKSKSKSKSK

内容的插入(a、i)

sed [address] i/ 插入内容 filename     #插入到所给内容的前面

  函数参数 s 表示替换(substitute)文件内字串。其指令格式如下 :

sed [address1[ ,address2]] s/pattern/replacemen/[flag] filename
sed -e '/#/i/words' file #在#字符的前面插入一行words
#这里的函数参数是i,它只能有一个地址参数。
sed -e '1/i/words' file
#在第一行前加一行words
cat "word" | sed -e '/$/.doc/g' #输出word.doc
#在word后面加上后缀名,从而输出word.doc
sed [address] a/ <插入内容> filename #插入到所给内容的前面
sed -e '/unix/a/ haha' test.txt #在含有unix的行后添加"haha"
#输出结果为:
unix
haha
sed -e '1 a/ hh' test.txt #在第一行后添加hh字符.
sed -i 's/指定的字符/要插入的字符&/' 文件 #在指定字符之前插入某字符
sed -i 's/指定的字符/&要插入的字符/' 文件 #在指定字符之后插入某字符
sed -i 's/^/要插入的字符&/' 文件 #在每行开头加上某字符串
sed -i 's/$/&要插入的字符/' 文件  #在每行结尾加上某字符串

文本的打印(p)

  基本格式:

sed [address1,[address2]] p filename
sed -e '/then/ p' filename  #打印所有行并重复打印含有then 的行
sed -n '/then/ p' filename #只打印含有then的行
sed -e '1,3 p' filename # 打印所有行并重复1-3行
sed -n '1,3 p' filename # 打印1-3行
sed -n '/if/,/fi/ p' filename #打印字符if和fi之间的内容

  p函数为sed的打印函数,在这里要注意-e 和-n 参数的区别。一般使用-n参数。

字元的替换(y)

sed -e 'y/abc../xyz../' filename
#把文件中的a字母替换成x, b替换成y, c替换成z。
sed -e 'y/abc/ABC' filename
#把小写的abc转换成大写的ABC

反相执行命令(!)

  基本格式:

sed [address1[ , address2]] ! 函数参数
sed -e '/1996/!d' filename
#删除除了含有1996的所有行。

读入下一行资料(n)

  基本格式:

sed [address1[ ,address2]] n
 sed -n -e '/echo/n' -e 'p' temp
#表示输出文件,但如果一行含有字符串echo,则输出包含该字符串的下一行。
sed -n -e 'n' -e 'p' filename
#输出文中的偶数行
#或者:
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行

命令的复用

  一次执行多个命令的方式有3种:

sed 's/w1/& w2/g; 1/i/words' filename   #(使用;号把命令隔开,注意前面不加-e参数)
sed -e 'cmd1' -e 'cmd2' filename #(使用多个-e参数)
sed 'cmd1' | sed 'cmd2' filename    #使用|隔开命令

定界符

  以上命令中字符 / 在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..1localhost

子串匹配标记(\1)  

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

echo this is digit  in a number | sed 's/digit \([0-9]\)/\1/'
this is in a number
#命令中 digit ,被替换成了 。样式匹配到的子串是 ,\(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 \,依此类推匹配到的第二个结果就是 \,例如: 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

退出(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

sed正则中的元字符  

  我们知道sed中的命令前面可以使用地址范围进行限制,表示对文件的某些符合条件的行执行相应的操作,其中我们可以使用正则表达式选出要操作的行,而sed中正则的语法可能与我们其他命令的正则语法有一些不同,这里我们有必要列出sed中常用的正则元字符:

$ 表示行尾
^ 表示行首
[a-z0-9]表示字符范围
[^]表示除了字符集中的字符以外的字符
sed的正则中 \(\) 和 \{m,n\} 需要转义
. 表示任意字符
* 表示零个或者多个
\+ 一次或多次  
\? 零次或一次
\| 表示或语法

sed在文件中查询文本的方式

  1)使用行号,可以是一个简单数字,或是一个行号范围:

x

x为行号

x,y

表示行号从x到y

/pattern

查询包含模式的行

/pattern /pattern

查询包含两个模式的行

pattern/,x

在给定行号上查询包含模式的行

x,/pattern/

通过行号和模式查询匹配的行

x,y!

查询不包含指定行号x和y的行

  2)使用正则表达式、扩展正则表达式(必须结合-r选项)

^

锚点行首的符合条件的内容,用法格式"^pattern"

$

锚点行首的符合条件的内容,用法格式"pattern$"

^$

空白行

.

匹配任意单个字符

*

匹配紧挨在前面的字符任意次(0,1,多次)

.*

匹配任意长度的任意字符

\?

匹配紧挨在前面的字符0次或1次

\{m,n\}

匹配其前面的字符至少m次,至多n次

\{m,\}

匹配其前面的字符至少m次

\{m\}

精确匹配前面的m次\{0,n\}:0到n次

\<

锚点词首----相当于 \b,用法格式:\<pattern

\>

锚点词尾,用法格式:\>pattern

\<pattern\>

单词锚点

 

分组,用法格式:pattern,引用\1,\2

[]

匹配指定范围内的任意单个字符

[^]

匹配指定范围外的任意单个字符

[:digit:]

所有数字, 相当于0-9, [0-9]---> [[:digit:]]

[:lower:]

所有的小写字母

[:upper:]

所有的大写字母

[:alpha:]

所有的字母

[:alnum:]

相当于0-9a-zA-Z

[:space:]

空白字符

[:punct:]

所有标点符号

#######sed的匹配模式支持正则表达式#####################
sed'5 q'/etc/passwd#打印前5行
sed-n '/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行
sed-n '/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符
sed-n '/o*/p'/etc/passwd#打印o字符重复任意次
sed-n '/o\{1,\}/p'/etc/passwd#打印o字重复出现一次以上
sed-n '/o\{1,3\}/p'/etc/passwd#打印o字重复出现一次到三次之间以上

linux命令学习之:sed的更多相关文章

  1. Linux命令学习-sed

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  2. 《Linux命令学习手册》系列分享专栏

    <Linux命令学习手册>系列分享专栏 <Linux命令学习手册>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/207 ...

  3. Linux命令学习笔记目录

    Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...

  4. 别出心裁的Linux命令学习法

    别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...

  5. Linux命令学习

    Linux命令学习 Ubuntu常用快捷键 •Ctrl+Alt+T: 打开终端 •Ctrl+Shift+T: 新建标签页 •Tab: 终端中命令补全 •Alt+数字N: 终端中切换到第N个标签页 •↑ ...

  6. Linux命令学习总结之rmdir命令的相关资料可以参考下

    这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...

  7. linux命令学习之:chmod

    chmod命令用来变更文件或目录的权限.在Linux系统家族里,文件或目录权限的控制分别以读取R.写入W.执行X3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录 ...

  8. Linux命令学习笔记1

    1.Linux命令学习 2.Mkdir /data       -创建文件夹 在/下创建文件夹 data 3.Cd               -目录切换 列如cd / 4.Touch /data/1 ...

  9. 20155229付钰涵-虚拟机安装及LINUX命令学习

    安装Ubuntu遇到的问题 问题一: 新建虚拟电脑的版本只有32-bit,与老师所给教程中的64-bit不符.为此我上百度搜寻了答案. 第一种方法: 控制面板--程序与功能--启动或关闭windows ...

  10. 安装虚拟机&Linux命令学习

    安装虚拟机&Linux命令学习 基于VirtualBox虚拟机安装Ubuntu 1.下载安装VirtualBox 根据自己电脑(32位操作系统)的实际情况,我在网上找了相应的VirtualBo ...

随机推荐

  1. jquery接触初级----- 一种新奇的选择器用法

    今天看到一个新奇的jquery 选择器的用法,因为以前没有见过,所以记录下来 1.jquery 选择器: 给body添加一个元素,添加元素的时候,同时把属性和点击事件都一起进行添加 <!DOCT ...

  2. Linux:服务器/客户端API调用错误检查

    昨天和今天上午,我分别实现简单的服务器和客户端,运行之后表示没问题,一切正常.但是这还是有问题的,最大的一个就是没有错误检查.现在我们来加上错误检查: 服务器的代码: #include <std ...

  3. Cannot detect Web Project version. Please specify version of Web Project through Maven project property <webVersion>. E.g.: <properties> <webVersion>3.0</webVersion> </properties>

    鼠标放在问题出会出现set web project version to 3.0和set web project version to 3.1两个选项 随便选一个版本就好了

  4. 转: JQuery this和$(this)的区别及获取$(this)子元素对象的方法

    1.JQuery this和$(this)的区别 相信很多刚接触JQuery的人,很多都会对$(this)和this的区别模糊不清,那么这两者有什么区别呢? 首先来看看JQuery中的  $()  这 ...

  5. 阿里云oss存储图片

    单线程版-上传网络流 import pymysql import oss2 import requests import logging # 添加日志 logging.basicConfig( lev ...

  6. Linux简介及Linux学习路线图

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

  7. java网页技术

    About jQuery Getting started with jQuery can be easy or challenging, depending on your experience wi ...

  8. 1.3.3、CDH 搭建Hadoop在安装之前(端口---CDH组件使用的端口)

    列出的所有端口都是TCP. 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外部通信. Compone ...

  9. MySql数据类型范围

    [MySql数据类型范围] 参考:http://blog.sina.com.cn/s/blog_4f925fc30102edg8.html

  10. python pbr 打包

    在之前学习stevedore时,在setup.py中使用setuptools打包发布了代码,然后调用代码中的实例化对象.参考我的文章 https://www.cnblogs.com/CaesarLin ...