[ sed简单介绍: ]

sed是一个非常好的文件处理工具, 它本身是一个管道命令, 以行为单位进行处理, 能够用于对数据行进行新增、选取、替换、删除等操作。
sed命令行格式:sed [-nefri] 'range command' file
如: sed '2d' aaa.txt                                   # 删除文件aaa.txt中第二行

[ sed工作流程: ]

使用vim这样的屏幕编辑器编辑一个文件的时候, 我们须要把这个文件打开, 这里存在两个问题:
1. 打开一个比較大的文件会消耗非常多内存。
2. 我们无法写脚本调用vim来编辑文件, 可是sed能够通过写脚本编辑文件。

sed属于流编辑器, 它在编辑文件的时候, 首先会把文件的一行内容读入内存,读入内存的部分,
称为模式空间;  然后依据我们的须要进行编辑,
编辑完后会把模式空间的内容输出到屏幕, 并把它里面的内容清空, 再读取下一行到模式空间, 这种话就避免了一次性读取整个文件。

[ sed经常使用选项: ]

-n: 仅仅会显示模式空间里的内容, 而不会显示没有编辑过的内容。

-e: 直接在指令列模式上进行 sed 的动作编辑;
-f: 直接将 sed 的动作写在一个档案内, -f filename 则能够运行 filename 内的sed 动作;
-r: sed 的动作支援的是延伸型正规表示法的语法。( 预设是基础正规表示法语法 )
-i: 直接改动读取的档案内容, 而不是由屏幕输出。 

[ sed经常使用命令: ]

d: 删除, 由于是删除,
所以 d 后面通常不接不论什么东西;

s:
替代, 能够直接进行替换的工作, 通常这个 s 的动作能够搭配正规表示法;

a: 追加, a 的后面能够接字符串, 而这些字符串会在新的一行出现(眼下的下一行);

i:  插入, i
的后面能够接字符串, 而这些字符串会在新的一行出现(眼下的上一行);

c: 代替, c 的后面能够接字符串, 这些字符串能够代替一行内容;

[ 经常使用命令举例: ]

## 删除操作 d :  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

range是范围, 删除操作有两种方法表示:
① 直接写一个数字, 表示对多少行进行操作.                       sed '2d' aaa.txt             #表示删除文件aaa.txt中第二行
② 使用正則表達式,  此时必需要使用两个反斜杠 // 隔开.   sed '/^Tom/d' aaa.txt  # 表示删除aaa.txt中以Tom开头的行
* 假设没有指定范围, 则会对全文进行操纵.                         sed 'd' aaa.txt               # 表示删除aaa.txt中全部的行

1.  sed '$d' aaa.txt                                 # 删除aaa.txt中最后一行 (对单行进行操作)

2. sed '7,9d' aaa.txt                              # 删除文件aaa.txt中第七行到第九行 (对多行进行操作)

3. sed '/aaa/,/bbb/d' aaa.txt                # 删除文件aaa.txt中含有aaa至含有bbb之间全部的行 (对多行进行操作)

## 替代操作 s :  - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

替换格式:  sed 'range s/orig/new/sign' file      # 假设没有指定范围的话, 将会对全文进行操作.

1. sed 's/aaa/bbb/' ccc.txt                   # 将ccc.txt全文中每行的第一个keyword aaa 替换成 bbb, 由于我们没有指定不论什么模式

2. sed 's/aaa/bbb/g' ccc.txt                # 将ccc.txt全文中全部 aaa 替换成 bbb, 由于我们加了sign: g

3. sed 's/aaa/bbb/2' ccc.txt               # 将ccc.txt全文中每行第二个 aaa 替换成 bbb, 由于我们加了sign: 2

4. sed '1s/aaa/bbb/g' ccc.txt              # 将ccc.txt全文中第一行全部 aaa 替换成 bbb, 由于我们加了range: 1, 加了sign: g



5. 上面演示样例也能够用其它字符隔开(仅仅有替换有):   sed 's#aaa#bbb#' ccc.txt



6. old位置支持正则, 但在new位置不支持正则, 除了字符 \n \&

   sed '1s/a/N&N/2' ccc.txt               # 将ccc.txt全文中第一行第二个 a 替换成NaN, & 相当于对前面 a 的引用



7. 对特定的范围做多个操作, 那么我们要把多个操作用 { } 括起来, 用 ; 隔开多个命令.

   sed '1{s/a/b/g; s/b/c/}' ccc.txt      # 先将ccc.txt全文中第一行全部 a 替换成 b, 再将第一行第一个keyword b 替换成 c



8. 上面所讲都是替换一个单词, 假设我们想替换某个字符, 那么能够使用 y 命令

   sed '1y/abc/xyz/' ccc.txt               # 将ccc.txt中全文第一行全部 a 替换成 x, b 替换成 y, c 替换成 z

##
追加操作 a :   - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1.  sed '/ab/a\xxx'
ccc.txt                # 将ccc.txt中含有 ab 的行以下再插入一行字符串xxx

2. sed '1a zhang\njim' ccc.txt           # 在ccc.txt中第一行以下插入zhang再在下一行插入jim, \n 起换行作用

## 插入操作 i :   -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - 
1. sed '/ab/i\xxx' ccc.txt                 # 将ccc.txt中含有 ab 的行上面再插入一行字符串xxx

2. sed '$a abc' ccc.txt                     # 在ccc.txt中最后一行插入abc

## 代替操作 c :   - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1. sed '/ab/cAB=AB' ccc.txt             # 将ccc.txt中含有 ab 的行整行替换成AB=AB

2. sed '1c ab' ccc.txt                        # 将ccc.txt中第一行整行替换成ab

## 显示模式空间 p :   - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1. sed '$a abc p' ccc.txt                   # 将模式空间和文件里的内容都显示在屏幕上

[ sed其它命令: ]

1. = 为显示行号

sed '/^abc/{=}' ccc.txt                 #  以abc开头的关键词所在的行号

2. n 为获取下一行 (当前行从模式空间删除,
下一行读入模式空间)

sed '/^a/ {n;s/b/B/g}' ccc.txt     # 匹配以a开头的下一行整行, 使用 B 替换 b.

3. N 为读取多行内容到模式空间: (当前行和下一行都在模式空间中)

sed '/^A/{s/tb/TB/; N; s/t\nb/TB \n/}' ccc.txt     # 匹配以 A 开头的行, 将tb替换成TB; 再读取下一行, 将当前行的t和下一行的b替换成TB

4. 使用多行模式空间的话, ^ 就不是行的开头, 而是模式空间的开头; $ 就不是行的结尾, 而是模式空间的结束.

替换前:a b c d e             替换后:A b c d e

                  a b c d e                            a b c d e

    sed 'N; s/^a/A/' ddd.txt           # 第一行和第二行都会被读入模式空间, 但仅仅有第一行的 a 会被替换成 A, 第二行的 a 并不会被替换.



    替换前:a b c d e             替换后: a b c d e

                  a b c d e                            a b c d E

    sed 'N; s/e$/E/' ddd.txt          # 第一行和第二行都会被读入模式空间, 但仅仅有第二行的 e 会被替换成 E, 第一行的 e 并不会被替换.

5. 除了模式空间, 还有保持空间, 我们能够把它理解成一个缓存. 保持空间的内容和模式空间的内容能够互换

h : 把模式空间内容存储到保持空间; G : 把保持空间里面的内容存储到模式空间;

替换前:a                        替换后:b

                  b                                      a

                  aa                                    bb

                  bb                                    aa



    sed '/a/{h; d}; /b/{G}' eee.txt # 匹配含有 a 的那一行,把它们保存在保持空间并从模式空间删除;匹配含有b的那一行,把保持空间内容放到模式空间;

6. set里面没有循环, 假设想实现循环的效果, 能够借助标签


linux-shell脚本命令之sed的更多相关文章

  1. linux shell脚本命令

    sort命令 sort #按照字典序排序 sort -n #以数值来排序,避免10比2小的情况 sort -k #如果文件有多列,指定排序的列 sort -r #逆序排列 uniq 命令 sort t ...

  2. linux 基础 shell脚本命令

    #########shell脚本命令#### 1.diff diff file file1 ####比较两个文件的不同 -c ####显示周围的行 -u ####按照一格式统一输出生成补丁 -r ## ...

  3. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  4. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  5. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  6. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

  7. 老李分享:《Linux Shell脚本攻略》 要点(四)

    老李分享:<Linux Shell脚本攻略> 要点(四)   1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2. ...

  8. 老李分享:《Linux Shell脚本攻略》 要点(二)

    老李分享:<Linux Shell脚本攻略> 要点(二)   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课 ...

  9. 读《Linux Shell脚本攻略》(第2版) 总结

    前段时间读完了<Linux Shell脚本攻略>(第2版)这本书,给部分想读这本书的人分享下个人感受. 说下这本书的难度吧.纯新手或者只懂少部分编程知识的人,读起来还是有很大难度的.以我为 ...

  10. linux ——shell 脚本

                                                      linux—shell 脚本  精简基础                 2018/10/30 13 ...

随机推荐

  1. 打印NSLog分类 Foundation+Log.m

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @implementation UIView(Log) + ...

  2. c语言 ,回调函数[个人理解]

    回调函数:把需要调用的方法的指针pCallBackFuncX作为参数传递给一个函数UsrFunction,以便该UsrFunction函数在处理相似事件的时候可以灵活的使用不同的方法.   以在fla ...

  3. CentOS 6 用SVN自动提交文件到web服务器

    关于 svn 的安装 参考:[转]Linux(centOS6.5)下SVN的安装.配置及开机启动 经过两天的各种尝试总算解决了,总结如下: 1.在建立库时注意 要让库的名称和  要同步的 web目录名 ...

  4. Python函数式编程:内置函数map()使用说明

    一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...

  5. (step8.2.2)hdu 2509(Be the Winner——简单博弈)

    题目大意:输入一个整数n,表示火柴堆数(原题其实指的是苹果堆数,但是为了尽量与模板保持一致,所以在这里理解为火柴堆数....其实理解为什么都没关系, 重要的是,理解就行....).在接下来的一行中,有 ...

  6. Shell中的if else语句小演示

    安安静静学习小shell,今天看到if else 喽~ 下面这个脚本是判断用户执行脚本的参数,如果是hello的话,就显示how are you 如果什么都没有,就提示输入 如果参数不是hello,就 ...

  7. location.href使用方法总结

    javascript中的location.href有非常多种使用方法,主要例如以下. self.location.href="/url" 当前页面打开URL页面 location. ...

  8. Sublime Text 2 新建C++ build system

    首先要有个MinGW(我这里借用ceemple的编译器 ,mingw32) 设置环境变量 右击我的电脑,点属性->高级->环境变量. 在系统环境变量在PATH里加入D:\Ceemple\m ...

  9. SQL Server 基础 04 函数与分组查询数据

    函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...

  10. IOS Notification 通知中心

    1.     通知中心概述 通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象. ...