sed 详解【转】
原文地址:http://www.cnblogs.com/sparkdev/archive/2017/07/10/7138073.html
基本命令格式
sed [常用选项] 命令文本 输入
常用选项
-n (--quiet, --silent):安静模式。在 sed 的基本用法中,所有来自标准输出的信息都会被列出到终端上。加上 -n 参数后,则只有被sed 处理的那些行才会被输出。
-e:指定在指令列模式上执行的命令文本。默认不需要指定,只有同时要执行多个命令文本时才需要显式的指定 -e 选项。
-f:同时要执行多个命令文本时,可以将这些命令文本写到一个文件中,然后通过 -f filename 的方式使用。
-r:sed 默认使用基础正则表达式语法(BRE),指定 -r 选项后使用扩展正则表达式语法(ERE)。
-i:直接修改读取的文档,而不是输出到终端。
常用命令
a:新增行, a 的后面接字串,这些字串会被添加到匹配行的下面。
c:替换行, c 的后面接字串,这些字串会替换掉匹配到的行。
d:删除行,删除匹配到的行。
i:插入行, i 的后面接字串,这些字串会被插入到匹配行的上面。
p:打印,将某些行输出。通常 p 会与参数 -n 一起使用,这样只输出匹配到的行。
s:字符串替换,主要搭配正则表达式使用。
解释一下本文中 "命令" 与 "命令文本" 的区别:
命令是一些抽象的操作,比如 a 指示新增行,d 指示删除行。
命令文本则是由命令和其它一些信息组合起来的一个字符串,用来执行具体的操作。
比如在第一行下面添加一行,内容为 'Hello world',命令文本为:'1a Hello world'
再如删除包含字符串 'Hello world' 的行,命令文本为:'/Hello world/d'
常用选项及命令详解
说明:本文示例中 demo 文件 test.txt 包含三行文字,内容为:
aa
bb
cc
demo 文件 hello.txt 包含三行文字,内容为:
Hello world! Hello Jack!
Hello China!
Hello Nick!
删除行
删除行需要使用命令 d:
$ sed '1d' test.txt # 删除第一行
$ sed '$d' test.txt # 删除最后一行
$ sed '1,2d' test.txt # 删除第一行到第二行
$ sed '2,$d' test.txt # 删除第二行到最后一行
注意,执行完上面的命令,我们只能在命令行终端上看到正确的结果,而 test.txt 文件根本没有发生变化:
选项 -i
如果想要直接在原文件上进行修改(其实是先修改文件的内容,然后保存到原文件中),需要使用选项 -i:
$ sed -i '1d' test.txt
注意,应用 -i 选项后命令行上没有输出内容,但是源文件被更新了。
新增行
a 命令可以在匹配的行下面新增行:
$ sed '1a Hello world!' test.txt # 在第一行下面新增一行,内容为 "Hello world!"
$ sed '$a Hello world!' test.txt # 在最后一行下面新增一行,内容为 "Hello world!"
$ sed '1,3a Hello world!' test.txt # 在第一行,第二行和第三行下面分别增加一行,内容
# 为 "Hello world!" 1,3 表示从第一行到第三行
$ sed '1a Hello world!\nHello China!' test.txt # 一次增加多行需要使用换行符 \n
选项 -e
-e 选项用来指定命令文本,如果只有一个命令文本时 -e 选项可以省略。如何要指定多个命令文本就需要使用 -e 选项。
$ sed -e '1a xxx' -e '2a yyy' test.txt
插入行
i 命令可以在匹配的行上面插入行,语法与新增行相同,只是新行在指定行的上面(与 a 命令的区别):
选项 -f
前面我们通过选项 -e 添加了多个命令文本,但是如果需要添加比较多的命令文本,使用选项 -e 就不太合适了。因为把所有的命令文本全部写在命令行中会导致维护困难。此时选项 -f 就派上用场了。我们可以把多个命令文本写入到文本文件中,然后通过 -f 选项进行引用。
我们创建一个叫 commands 的文件,在里面添加三个命令文本如下:
1i Hello world!
2i Hello world!
3i Hello world!
然后执行命令:
$ sed -f commands test.txt
通过 -f 选项,commands 文件中的三个命令文本都被执行了!
替换行
使用 c 命令可以轻松的进行整行替换:
$ sed '1c Hello world!' test.txt # 把第一行替换为 "Hello world!"
$ sed '1,3c Hello world!' test.txt # 把第一行到第三行替换为 "Hello world!"
注意,上图中的命令把三行文本替换成了一行文本!
字符串替换
与行替换不同,s 命令只替换匹配到的内容(一般为字符串):
$ sed 's/Hello/Hi/' hello.txt # 把Hello 替换为 Hi
上图带给我们的困惑之一是:为什么第一行中只有第一个 Hello 被替换了?答案是 sed 默认只会替换第一个匹配到的内容!那么我们的第二个困惑来了:如果只替换第一个匹配到的内容,那么为什么第二行和第三行的 Hello 都被替换了呢?这个问题涉及的 sed 的工作方式,sed 是一个以行为单位进行文本处理的工具!所以图中的三行是被分为三次,每次一行进行处理的。因而第二行和第三行中的 Hello 对于本行来说都是第一个匹配到的内容,被替换是正确的。
要进行全局替换,需要在命令文本中指定 g,试试下面的命令:
$ sed 's/Hello/Hi/g' hello.txt # 把匹配到的所有Hello 都替换为 Hi
这下第一行中的两个 Hello 都被替换了。
我们还可以限制执行替换操作的行:
$ sed '2,3s/Hello/Hi/g' hello.txt # 只在第二行和第三行进行替换操作
当然也可以通过替换来删除不需要的字符串:
$ sed 's/Hello//g' hello.txt # 删除字符串 Hello
定界符
虽然 / 是最常用的定界符,但是你也可以使用其它的字符。举个简单的例子,当你要在 linux 下进行路径替换时,使用 / 作为定界符是很不爽的(需要很多的转义符),此时换一个定界符是最好的解决方案:
上图中我们使用分号作为定界符轻松实现了路径替换。
匹配
细心的同学可能已经注意到了,sed 所有的操作都是建立在行定位之上的。也就是说无论你要干什么,都要先找到(匹配)目标行。连最简单的删除行 '1d',也得先定位到第一行,然后才能删除。所以唯一能限制我们发挥 sed 能力的因素就是:如何匹配到期望的行?
答案是掌握基本的规则,然后多练习! -n 选项和 p 命令是我们练习的好帮手。-n 选项告诉 sed 只输出那些被处理过的行。比如 sed '1a Hello world!' test.txt 命令默认会输出四行,应用 -n 后只输出一行:
p 命令则告诉 sed 只输出那些匹配到的行, 比如命令:
$ sed -n '1p' test.txt 和命令sed -n '2,3s/Hello/Hi/gp' hello.txt
行匹配的规则大概有两类:通过行号进行匹配和通过正则表达式进行匹配。
下面是一些通过行号进行匹配的例子:
$ sed -n '1p' test.txt # 匹配第一行
$ sed -n '$p' test.txt # 匹配最后一行
$ sed -n '2,3p' test.txt # 匹配第二行和第三行
$ sed -n '3,$p' test.txt # 匹配第三行和第三行后的每一行
下面是通过正则表达式进行匹配的例子:
$ sed -n '/Hello/p' hello.txt
默认的匹配是区分大小写的,要忽略大小写可以使用I(大写字母i)
$ sed -n '/hello/Ip' hello.txt
下面几个是正则表达式匹配后执行操作的例子:
$ sed '/Hello/d' hello.txt # 找到匹配的行,并删除
$ sed '/Hello/a world!' hello.txt # 找到匹配的行,并在它们下面添加新行
$ sed '/Hello/s/world/China/g' hello.txt # 找到匹配的行,在这些行中执行替换
sed 详解【转】的更多相关文章
- sed 详解
sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...
- 常用命令——sed详解
以下内容参考:http://qifuguang.me/2015/09/21/sed命令详解/ sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在 ...
- sed详解
1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ...
- Linux之sed详解
转载:http://blog.chinaunix.net/u/22677/showart_1076318.html 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...
- Shell 基础 -- 流编辑器 sed 详解
一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...
- Shell脚本学习之sed详解
在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理. 一.什么是sed? sed 是一种在线编辑器,它一次处理一行内容.sed是非交互式的编辑器.它不会修改文件,除 ...
- 文本处理三剑客之 sed详解
1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- sed详解---用法及解释
1.sed -n '2'p filename 打印文件的第二行. 2.sed -n '1,3'p filename 打印文件的1到3行 3. sed -n '/Neave/'p filename 打印 ...
- Linux三剑客之sed详解(2)
一.sed 分组替换(),\1 实例:I am a oldboy teacher. 吧oldboy 提取出来 二.特殊符号&代表被替换的字符串 实例:批量替换文件名 把stu_102999_1 ...
随机推荐
- 设计模式C++学习笔记之四(Multition多例模式)
多例模式,这个在GOF的模式设计里没有提到,但在实际工作中确实会用到.更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com. 4.1.解释 main(),客户 略 说明: ...
- ObjectArx2013新建工程出错的解决办法
最近将一个ObjectArx升级到Arx2013版,使用ObjectArx2013向导时,新建项目时弹出错误"未能加载项目文件.给定编码中的字符无效.第1行,位置1",经网上查找发 ...
- mysql导入sqlserver数据库表
原文:https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中,创建目标数据库(注意:因为是 ...
- 【转】Java并发编程:Thread类的使用
一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...
- Hash之哈希表的详解
Hash算法 Hash算法的原理; 决绝冲突的办法是: 线性探查法; 双散列函数法; 拉链法处理碰撞; 哈希原理及实现; 哈希表-Hash table, 也叫散列表;
- Tomcat服务的安装及配置
在进行Java Web开发时必须有Web服务器的支持,常用的Web服务器便是Tomcat,本文主要介绍Tomcat的安装和配置.客户端通过Web浏览器发送一个基于HTTP协议的请求到服务器上后,服务器 ...
- python 基础 three day
本节主要内容: 一. python基本数据类型有哪些? 1. int ==> 整数.主要用来进行数学计算. 2. str ==> 字符串,可以保存少量数据并进行相应的操作 3. boo ...
- java泛型类型变量能调用的方法
public class Person { } public class Student extends Person{ private String name; public Student(Str ...
- 玩转EhCache之最简单的缓存框架
二.主要特性 快速: 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具 ...
- 21)django-csrf(跨站请求伪造)
一:目录 1)简介及无CSRF时存在隐患 2)csrf原理 3)csrf 设置 4)Form提交(CSRF) 5)Ajax提交(CSRF) CSRF请求头 X-CSRFToken 二:csrf简介 c ...