linux sed文本
- 常规编辑器编辑困难的文本。
- 太过庞大的文本,使用常规编辑器难以胜任(如vi一个几百兆的文件)。
- 有规律的文本修改,加快文本处理速度(比如说全文替换)。
sed命令 | 作用 |
a | 在匹配行后面加入文本 |
c | 字符转换 |
d | 删除行 |
D | 删除第一行 |
i | 在匹配行前面接入文本 |
h |
复制模板块的内容到存储空间 |
H | 追加模板块的内容到存储空间 |
g | 将存储空间的内容复制到模式空间 |
G | 将存储空间的内容追加到模式空间 |
n | 读取下一个输入行,用下一个命令处理新的行 |
N | 追加下一个输入行到模板块后并在二者间插入新行 |
p | 打印匹配的行 |
P | 打印匹配的第一行 |
q | 退出sed |
r | 从外部文件中读取文本 |
w | 追加写文件 |
! | 匹配的逆 |
s/old/new | 用new替换正则表达式old |
= | 打印当前行号 |
sed常用的参数:
sed参数 | 作用 |
-e | 多条件编辑 |
-h | 帮助信息 |
-n | 不输出不匹配的行 |
-f | 指定sed脚本 |
-V | 版本信息 |
-i | 直接修改原文件 |
sed常用的正则表达式匹配:
元字符 | 作用 |
^ | 匹配行的开始。如:/^cat/匹配所有以cat开头的行 |
$ | 匹配行的结束。如:/cat$/匹配所有以cat结尾的行 |
. | 匹配任一非换行字符。如:/c.t/匹配c后接一个任意字符,然后是t |
* | 匹配零个或任意多个字符。如:/*cat/匹配一串字符后紧跟cat的所有行 |
[] | 匹配指定范围内的字符。如:/[Cc]at/匹配cat和Cat |
[^] | 匹配指定范围外的任意单个字符。如:/[^A-Z]/匹配没有大写字母的行 |
\(..\) | 保存匹配的字符。如:s/\(love\)able/\1rs/, loveable被替换成lovers |
& | 保存搜索字符用来替换其他字符。如:s/love/**&**/,love编程**love** |
\< | 锚定单词的开始。如:/\<cat/匹配包含以cat开头的单词的行 |
\> | 锚定单词的结尾。如:/cat\>/匹配包含以cat结尾的单词的行 |
[x\{n\} | 重复字符x,m次。如:/o\{5\}/匹配包含5个o的行 |
x\{m,\} | 重复字符x,至少m次。如:/o\{5,\}/匹配至少有5个o的行 |
x\{n,m\} | 重复字符x,至少m次,不多于n次。如:/o\{5,10\}/匹配5到10个o的行 |
[root@kurol ~]# cat sed.txt
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
sed [option] 'command' file
#option 是sed可以接受的参数
#command 是sed的命令集(一共有25个)
#使用-e参数和分号连接多编辑命令
#该参数本身只是sed的一个简单参数,表示将下一个字符串解析为sed编辑命令
#一般情况下可以忽略,但是当sed需要传递多个编辑命令时该参数就不能少了
下面的例子演示了将this改为that的同时,还要讲line改为LINE,两个编辑命令前都要使用-e参数,如果有更多的编辑需求,以此类推
[root@kurol ~]# sed -e 's/this/that/g' -e 's/line/LINE/g' sed.txt
that is LINE 1, that is First LINE
that is LINE 2, the Second LINE, Empty LINE followed
that is LINE 4, that is Third LINE
that is LINE 5, that is Fifth LINE
使用分号(;)连接两个都编辑的命令,上面的命令用分号也可达到同样的效果:
[root@kurol ~]# sed 's/this/that/g ; s/line/LINE/g' sed.txt
that is LINE 1, that is First LINE
that is LINE 2, the Second LINE, Empty LINE followed
that is LINE 4, that is Third LINE
that is LINE 5, that is Fifth LINE
删除
使用d命令可删除指定的行:
#将file的第一行删除后输出到屏幕
[root@kurol ~]# sed '1d' sed.txt
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
由于sed默认不修改原文件,如果希望保存修改后的文件则需要用重定向:
sed '1d' sed.txt > saved_file
如果想直接修改文件,使用 -i 参数,这样的方式不会有任何输出,而是直接修改了源文件
sed -i '1d' sed.txt
删除指定范围的行 :
删除1-3行:
[root@kurol ~]# sed '1,3d' sed.txt
this is line 4, this is Third line
this is line 5, this is Fifth line
删除第一行当最后一行:
[root@kurol ~]# sed '1,$d' sed.txt
[root@kurol ~]# #清空了sed.txt文件
删除最后一行:
[root@kurol ~]# sed '$d' sed.txt
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
删除指定范围以外的行(只保留第五行):
[root@kurol ~]# sed '5!d' sed.txt
this is line 5, this is Fifth line
删除所有包含Empty的行:
[root@kurol ~]# sed '/Empty/d' sed.txt
this is line 1, this is First line
this is line 4, this is Third line
this is line 5, this is Fifth line
删除空行:
[root@kurol ~]# sed '/^$/d' sed.txt
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
查找替换
使用s命令可将查找到的匹配文本内容替换成新的文本
s命令用于替换文本
将每行第一个line替换成LINE:
[root@kurol ~]# sed 's/line/LINE/' sed.txt
this is LINE 1, this is First line
this is LINE 2, the Second line, Empty line followed
this is LINE 4, this is Third line
this is LINE 5, this is Fifth line
以上只是把每一行的第一个line被替换了,'s/old/new/' 默认情况下只替换第一次匹配到的内容.
将每行匹配到2个line,并改为LINE:
[root@kurol ~]# sed 's/line/LINE/2' sed.txt
this is line 1, this is First LINE
this is line 2, the Second LINE, Empty line followed
this is line 4, this is Third LINE
this is line 5, this is Fifth LINE
s命令利用g选项,可以完成所有匹配值的替换(全文替换):
[root@kurol ~]# sed 's/line/LINE/g' sed.txt
this is LINE 1, this is First LINE
this is LINE 2, the Second LINE, Empty LINE followed
this is LINE 4, this is Third LINE
this is LINE 5, this is Fifth LINE
字符转换
使用y命令可进行字符转换,其作用为将一系列字符逐个地变换为另外一系列字符,基本用法如下:
sed 'y/old/new/' file
该命令会将file中的o转换为n、l转换成e、d转换成w
注意转换字符和被转换字符的长度要相等,否则sed无法执行
将数字1转换为A,2转换为B,4转换为D,5转换为E:
[root@kurol ~]# sed 'y/1245/ABDE/' sed.txt
this is line A, this is First line
this is line B, the Second line, Empty line followed
this is line D, this is Third line
this is line E, this is Fifth line
插入文本
使用i或a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入
使用i在第二行前插入文本:
[root@kurol ~]# sed '2 i Insert' sed.txt
this is line 1, this is First line
Insert
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
使用a在第二行后插入文本:
[root@kurol ~]# sed '2 a Insert' sed.txt
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
Insert
this is line 4, this is Third line
this is line 5, this is Fifth line
在匹配行的上一行插入文本:
[root@kurol ~]# sed '/Second/i\Insert' sed.txt
this is line 1, this is First line
Insert
this is line 2, the Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
读入文本
使用r命令可从其他文件中读取文本,并插入匹配行之后
将/etc/passwd 中的内容读出放到sed.txt空号之后
[root@kurol ~]# sed '/^$/r /etc/passwd' sed.txt
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
root:x:0:0:root:/root:/bin/bash
......
nginx:x:498:499:Nginx web server:/var/lib/nginx:/sbin/nologin
this is line 4, this is Third line
this is line 5, this is Fifth line
打印
使用p命令可进行打印,这里使用sed命令时一定要加-n参数,表示不打印没关系的行。从之前的例子可以看出,由于sed的工作原理是基于行的,因此每次都有大量的输出。可是这些输出中有一些我们并不需要看到的,而只需要输出匹配的行或者处理过的行就好了。简单来说,打印操作是删除操作的“逆操作”。
打印出文件中指定的行:
[root@kurol ~]# sed -n '1p' sed.txt
this is line 1, this is First line
将the替换成THE,sed实际处理了第二行,其他几行由于没有匹配所以并未真正处理,但是sed的工作原理是基于流的,所以所有流过的行都打印出来了:
[root@kurol ~]# sed 's/the/THE/' sed.txt
this is line 1, this is First line
this is line 2, THE Second line, Empty line followed
this is line 4, this is Third line
this is line 5, this is Fifth line
使用p命令,则只打印实际处理过的行,简化了输出(使用-n参数):
[root@kurol ~]# sed -n 's/the/THE/p' sed.txt
this is line 2, THE Second line, Empty line followed
写文件
sed本身默认并不改写原文件,而只是对缓存区的文本做了修改并输出到屏幕。所以想保存文件,除了之前提到的两种方法外(使用重定向或-i参数),还可以使用w命令将结果保存到外部指定文件。
[root@kurol ~]# sed -n '1,2 w output' sed.txt
[root@kurol ~]# #这里没有任何输出,因为输出被重定向到output文件了
[root@kurol ~]# cat output
this is line 1, this is First line
this is line 2, the Second line, Empty line followed
sed脚本
在平日的工作中,需要定期对一些文件做分析操作,这种例行的工作往往有一定“标准化” 的操作,比如说先去除文件中所有的空行,然后再全部替换某些字符等,这种过程类似于生产线上程式化的流水作业。事实上,可以把这些动作静态化地写到某个文件中,然后调用sed命令并使用-f参数指定该文件,这样就可以将一系列动作“装载”并应用于指定文件中,这无疑加快了工作效率,这种文件就是sed脚本。
如,创建sed.rules脚本文件,该sed脚本的作用是将全文的this改为THAT,并删除所有空号
[root@kurol ~]# cat sed.rules
s/this/THAT/g
/^$/d
[root@kurol ~]# sed -f sed.rules sed.txt #使用-f参数指定该脚本应用于sed.txt
THAT is line 1, THAT is First line
THAT is line 2, the Second line, Empty line followed
THAT is line 4, THAT is Third line
THAT is line 5, THAT is Fifth line
linux sed文本的更多相关文章
- Linux - sed 文本操作
SED 是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大. sed全称是:Stream EDitor 调用sed命令有两种 ...
- Linux的文本处理工具浅谈-awk sed grep
Linux的文本处理工具浅谈 awk 老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...
- awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- Linux Bash文本操作之sed篇其二
上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...
- Linux sed 替换第一次出现的字符串
/********************************************************************************* * Linux sed 替换第一次 ...
- linux sed命令参数及用法详解
linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...
- [转帖]linux sed命令
linux sed命令就是这么简单 https://www.cnblogs.com/wangqiguo/p/6718512.html 用到的最多的就是一个sed -i 's/nn/mm/' 的命令了. ...
- Linux sed命令使用方法
sed(Stream Editor)是Linux中文本处理使用非常广泛的工具,可以对文件内容进行替换.删除.新增.选取特定行等功能.下面通过sed常用实例介绍sed命令的使用方法. sed基本语法 s ...
- 理解linux sed命令
理解linux sed命令(2010-02-27 18:21:20) 标签:linuxshellsed替换 分类:革命本钱 1. Sed简介sed是一种在线编辑器,它一次处理一行内容.处理时,把当 前 ...
随机推荐
- 12、JAVA内存模型与线程
一.JMM 有序性,可见性,原子性 synchorize :3个性都有: volatile:保证可见性+禁止指令重排: 二.线程的五种状态 面向过程与面向对象的差别 面向过程:站在计算机的角度分析和解 ...
- POJ 2965&&1753
最近由于复习备考(然而考得还是很炸),很久没打题目了.现在开始刷寒假作业,不得不搞POJ 话说没有中文真的好烦啊! 先看1753 题目大意是说在一个4*4的格子中有黑白两色的棋子,你可以翻动其中的棋子 ...
- proftpd启动失败提示unable to determine IP address of “xxx.com”
proftpd启动失败提示unable to determine IP address of “xxx.com”这种proftpd启动失败的原因是无法解析后面主机的IP地址,解决方法是在DNS列表中增 ...
- 【Orleans开胃菜系列1】不要被表象迷惑
[Orleans开胃菜系列1]不要被表象迷惑 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ ...
- C# Language Specification 5.0 (翻译)第二章 词法结构
程序 C# 程序(program)由至少一个源文件(source files)组成,其正式称谓为编译单元(compilation units)[1].每个源文件都是有序的 Unicode 字符序列.源 ...
- flask_admin 笔记四 自定义视图
定义自己的视图 对于您的要求非常具体的情况,您很难用内置的ModelView类来满足这些需求,Flask-Admin使您可以轻松地完全控制并将自己的视图添加到界面中. 1)独立视图 可以通过扩展Bas ...
- JNI探秘-----你不知道的FileInputStream的秘密
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 设计模式系列结束,迎来了LZ ...
- 从浏览器输入URL到显示页面到底发生了什么?
首先说明一下,当系统本地缓存了你所请求的资源时,会直接把缓存内容解析并显示,而不会进行以下的一系列行为. 一.DNS域名解析 至今的计算机数量可谓是数不胜数,而它们的唯一识别身份就是ip地址.我们常说 ...
- Git 使用简记
目录 git 标签 添加标签 git tag <tagname> ,例:git tag v1.0 添加带有说明的标签 git tag -a v0.1 -m "第一次提交" ...
- 华为云Istio服务网格,让应用治理智能化、可视化