linux命令学习之:sed
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的更多相关文章
- Linux命令学习-sed
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- 《Linux命令学习手册》系列分享专栏
<Linux命令学习手册>系列分享专栏 <Linux命令学习手册>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/207 ...
- Linux命令学习笔记目录
Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...
- 别出心裁的Linux命令学习法
别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...
- Linux命令学习
Linux命令学习 Ubuntu常用快捷键 •Ctrl+Alt+T: 打开终端 •Ctrl+Shift+T: 新建标签页 •Tab: 终端中命令补全 •Alt+数字N: 终端中切换到第N个标签页 •↑ ...
- Linux命令学习总结之rmdir命令的相关资料可以参考下
这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...
- linux命令学习之:chmod
chmod命令用来变更文件或目录的权限.在Linux系统家族里,文件或目录权限的控制分别以读取R.写入W.执行X3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录 ...
- Linux命令学习笔记1
1.Linux命令学习 2.Mkdir /data -创建文件夹 在/下创建文件夹 data 3.Cd -目录切换 列如cd / 4.Touch /data/1 ...
- 20155229付钰涵-虚拟机安装及LINUX命令学习
安装Ubuntu遇到的问题 问题一: 新建虚拟电脑的版本只有32-bit,与老师所给教程中的64-bit不符.为此我上百度搜寻了答案. 第一种方法: 控制面板--程序与功能--启动或关闭windows ...
- 安装虚拟机&Linux命令学习
安装虚拟机&Linux命令学习 基于VirtualBox虚拟机安装Ubuntu 1.下载安装VirtualBox 根据自己电脑(32位操作系统)的实际情况,我在网上找了相应的VirtualBo ...
随机推荐
- 利用目录函数(opendir,readdir,closedir)查找文件个数
如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数.Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配 ...
- python模块os
一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...
- avalon2学习教程06样式操作
avalon2的ms-css的变革思路与ms-attr一样,将多个操作合并成到一个对象里面处理,因此没有ms-css-name="value",只有ms-css="Obj ...
- 19.Observales
然后 ng serve看看能不能启动 OK
- Javascript中构造函数的返回值问题和new对象的过程
首先明确一点:javascript中构造函数是不需要有返回值的,这一点跟java很类似.可以认为构造函数和普通函数的最大差别就是:构造函数中没有return语句,普通函数可以有return语句:构造函 ...
- hasattr() getattr() setattr() 函数使用方法
1. hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是n ...
- kdump内核
什么是kdump? kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动到第二个内核.第二个内核通常叫做捕获内核,以很小内存启动以捕获转储 ...
- spring-boot-devtools Idea 热部署
1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...
- 如何添加Modeling 菜单
创建page 在protal settings的cdoform中add new item 在modeing中就可以使用该对象对应的维护页面了.
- 无线渗透wpa加密路由器
破解wpa加密路由器的原理不同于破解wep加密路由器,只能通过暴力破解获取. 但是获取握手keystream的原理差不多 首先杀死可能会和破解冲突的进程 airmon-ng check kill 开启 ...