Linux学习之sed命令详解
概述
sed是stream editor的简称,也就是流编辑器。它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
使用语法
sed命令的使用规则是这样的:
1 |
sed [option] 'command' input_file |
其中option是可选的,常用的option有如下几种:
- -n 使用安静(silent)模式(想不通为什么不是-s)。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;
- -e 直接在指令列模式上进行 sed 的动作编辑;
- -f 直接将 sed 的动作写在一个文件内,
-f filename
则可以执行filename内的sed命令; - -r 让sed命令支持扩展的正则表达式(默认是基础正则表达式);
-i 直接修改读取的文件内容,而不是由屏幕输出。
常用的命令有以下几种:
a \: append即追加字符串, a \的后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选择的行的后面都加上字符串s;
- c \: 取代/替换字符串,c \后面跟上字符串s(多行字符串可以用\n分隔),则会将当前选中的行替换成字符串s;
- d: delete即删除,该命令会将当前选中的行删除;
- i \: insert即插入字符串,i \后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选中的行的前面都插入字符串s;
- p: print即打印,该命令会打印当前选择的行到屏幕上;
- s: 替换,通常s命令的用法是这样的:
1,2s/old/new/g
,将old字符串替换成new字符串
命令示例
假设有一个本地文件test.txt,文件内容如下:
[qifuguang@winwill~]$ cat test.txt
this is first line
this is second line
this is third line
this is fourth line
this fifth line
happy everyday
end
本节将使用该文件详细演示每一个命令的用法。
a命令
1 |
[qifuguang@winwill~]$ sed '1a \add one' test.txt |
本例命令部分中的1表示第一行,同样的第二行写成2,第一行到第三行写成1,3
,用$
表示最后一行,比如2,$
表示第二行到最后一行中间所有的行(包含第二行和最后一行)。本例的作用是在第一行之后增加字符串”add one”,从输出可以看到具体效果。
1 |
[qifuguang@winwill~]$ sed '1,$a \add one' test.txt |
本例表示在第一行和最后一行所有的行后面都加上”add one”字符串,从输出可以看到效果。
1 |
[qifuguang@winwill~]$ sed '/first/a \add one' test.txt |
本例表示在包含”first”字符串的行的后面加上字符串”add one”,从输出可以看到第一行包含first,所以第一行之后增加了”add one”
1 |
[qifuguang@winwill~]$ sed '/^ha.*day$/a \add one' test.txt |
本例使用正则表达式匹配行,^ha.*day$
表示以ha开头,以day结尾的行,则可以匹配到文件的”happy everyday”这样,所以在该行后面增加了”add one”字符串。
i命令
i命令使用方法和a命令一样的,只不过是在匹配的行的前面插入字符串,所以直接将上面a命令的示例的a替换成i即可,在此就不啰嗦了。
c命令
1 |
[qifuguang@winwill~]$ sed '$c \add one' test.txt |
本例表示将最后一行替换成字符串”add one”,从输出可以看到效果。
1 |
[qifuguang@winwill~]$ sed '4,$c \add one' test.txt |
本例将第四行到最后一行的内容替换成字符串”add one”。
1 |
[qifuguang@winwill~]$ sed '/^ha.*day$/c \replace line' test.txt |
本例将以ha开头,以day结尾的行替换成”replace line”。
d命令
1 |
[qifuguang@winwill~]$ sed '/^ha.*day$/d' test.txt |
本例删除以ha开头,以day结尾的行。
1 |
[qifuguang@winwill~]$ sed '4,$d' test.txt |
本例删除第四行到最后一行中的内容。
p命令
1 |
[qifuguang@winwill~]$ sed -n '4,$p' test.txt |
本例在屏幕上打印第四行到最后一行的内容,p命令一般和-n选项一起使用。
1 |
[qifuguang@winwill~]$ sed -n '/^ha.*day$/p' test.txt |
本例打印以ha开始,以day结尾的行。
s命令
实际运用中s命令式最常使用到的。
1 |
[qifuguang@winwill~]$ sed 's/line/text/g' test.txt |
本例将文件中的所有line替换成text,最后的g是global的意思,也就是全局替换,如果不加g,则只会替换本行的第一个line。
1 |
[qifuguang@winwill~]$ sed '/^ha.*day$/s/happy/very happy/g' test.txt |
本例首先匹配以ha开始,以day结尾的行,本例中匹配到的行是”happy everyday”这样,然后再将该行中的happy替换成very happy。
1 |
[qifuguang@winwill~]$ sed 's/\(.*\)line$/\1/g' test.txt |
这个例子有点复杂,先分解一下。首先s命令的模式是s/old/new/g
这样的,所以本例的old部分即\(.*\)line$
,sed命令中使用\(\)
包裹的内容表示正则表达式的第n部分,序号从1开始计算,本例中只有一个\(\)
所以\(.*\)
表示正则表达式的第一部分,这部分匹配任意字符串,所以\(.*\)line$
匹配的就是以line结尾的任何行。然后将匹配到的行替换成正则表达式的第一部分(本例中相当于删除line部分),使用\1
表示匹配到的第一部分,同样\2
表示第二部分,\3
表示第三部分,可以依次这样引用。比如下面的例子:
1 |
[qifuguang@winwill~]$ sed 's/\(.*\)is\(.*\)line/\1\2/g' test.txt |
正则表达式中is
两边的部分可以用\1
和\2
表示,该例子的作用其实就是删除中间部分的is。
原文链接:http://qifuguang.me/2015/09/21/sed命令详解/,多谢作者分享
Linux学习之sed命令详解的更多相关文章
- Linux学习之iostat命令详解
我们可以用iostat 命令来监视系统输入/输出.设备负载,这通过观察与它们的平均传送速率相关的物理磁盘的活动时间 来实现.iostat 命令生成的报告可以用来更改系统配置,从而更好地平衡物理磁盘和适 ...
- 转 linux之sed命令详解
http://jingyan.baidu.com/article/fec4bce2228f60f2618d8bb0.html sed 编辑裁剪文件命令 sed -i "s/\/db\/te ...
- 【转】【Linux】sed命令详解
sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...
- Linux shell sed 命令详解
详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761 sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在 ...
- Linux上的free命令详解、swap机制
Linux上的free命令详解 解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- Linux学习之用户配置文件详解(十四)
Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...
- [转帖]Docker学习之Dockerfile命令详解
Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...
- Linux CAT与ECHO命令详解 <<EOF EOF
Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: .一次显示整个文件. $ cat filename .从键盘 ...
随机推荐
- Memcached安装卸载
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...
- 获取oracle sql语句中绑定变量值的方法
在诊断 sql的性能问题时,我们有时候须要获取其绑定变量的实际值,然后将此实际值带入到sql语句其中,用原来的sql构成select语句(带where条件),实际的运行一下,看一下选择性怎样. 本文就 ...
- 让rdlc报表在ReportViewer中水平居中的方法
正常情况下,rdlc报表在Reportviewer中是居左显示的,如图: 在Reporviewer的属性中,我没有找到能让rdlc的居中显示的方法.网上其他人用的方法都试了,没能实现,只能自己找方法解 ...
- 在Activity中动态设置TextView的隐藏属性
if (true) { //显示 viewHolder.tvLine.setVisibility(View.INVISIBLE);} else { //不显示 viewHolder.tvLine.se ...
- LeetCode之ReverseWorldString
题目:将一个英文句子翻转,比如:the sky is blue 翻转后变为:blue is sky the 分析:我的实现方法是,利用栈将单词存储起来,然后再顺序拿出来,单词进栈还需注意添加空格. 主 ...
- jquery ajax后台向前台传list 前台用jquery $.each遍历list
$.ajax({ type: 'post', url: xxx.action', dataType: 'text', success: function(data){ var dataObj=eval ...
- phpcms 调用全站最新发布数据
phpcms模板标签没有调用全站最新发布的数据 所以参考phpcms本身自带的lists方法写了一个Countlists调用全站数据 /** * 全站最热 * @param $data */ publ ...
- 5款免费Windows远程连接Linux桌面软件(VNC客户端)
不论我们出于何种的用途目的,很多朋友有需要用到VNC链接Linux桌面环境,之前老左有分享过VNC Viewer绿色软件,昨天有朋友提出来使用之后登录远程桌面的界面.分辨率等有些色差.流畅程度 ...
- Oracle EBS-SQL (WIP-9):检查车间任务超发料.sql
select WE.WIP_ENTITY_NAME 任务号, MFG_LOOKUPS_WJS.MEANING ...
- 为每个页面加上Session判断 转
首先新建一个类,继承自System.Web.UI.Page,然后重写OnInit,如下: using System; using System.Data; using System.Configu ...