linux-shell脚本命令之sed

linux-shell脚本命令之sed

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

[ 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里面没有循环, 假设想实现循环的效果, 能够借助标签


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118306.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2021navicat激活码【2021免费激活】

    (2021navicat激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    46
  • Maven 菜鸟教程 5 常用插件配置

    Maven 菜鸟教程 5 常用插件配置jdk编译插件jetty插件把maven项目配置为标准web项目插件

    2022年9月7日
    0
  • SENT协议译码的深入探讨

    SENT协议译码的深入探讨作者:Ben在工作期间,我有机会仔细地研究现代车辆上的一些最新传感器技术。虽然这些特殊的传感器已经存在一段时间了,但是SENT技术越来越多地出现在车辆中。在汽车论坛中,我发现有关使用这些传感器的问题和讨论有所增加。这些现象促使我去研究如何利用虹科Pico示波器从这些传感器中获得尽可能多的信息。我不会在SENT协议上花费太多时间,因为网络上有很多关于该协议如何工作的资料。但是,我会简单介绍一下这个网络。SENT代表单边半字节传输,并遵循J2716标准。它是低成本且单向的(仅一个方向),这意味着传

    2022年6月16日
    21
  • (修改gho文件办法)做属于自己个性的gho系统

    (修改gho文件办法)做属于自己个性的gho系统(修改gho文件办法)做属于自己个性的gho系统一修改GHO文件中的注册表:想要修改注册表首先要知道XP系统注册表存放的位置:WindowsXP的绝大部分注册表数据文件存放在C:\WINDOWS\system32\config。该目录里面包含了5个没有扩展名的文件,即当前注册表文件:  DEFAULT(默认注册表文件,位于注册表的HKEY_USERS项分支下…

    2022年7月12日
    34
  • 自动阈值法.m_自动阈值夺获功能

    自动阈值法.m_自动阈值夺获功能%自动阈值法:Otsu法用MATLAB实现Otsu算法:clc;clear;close;I=imread(‘e:\role0\003i.bmp’);subplot(1,2,1),imshow(I);title(‘原始图像’)gridon;%显示网格线axison;%显示坐标系level=graythres

    2022年10月19日
    0
  • jedis连接redis3.2.9集群密码问题[通俗易懂]

    jedis连接redis3.2.9集群密码问题[通俗易懂]转载来自:https://www.cnblogs.com/snowstar123/p/5696052.html主要想说的是,源码中对于jedis连接redisclsuter没有设置密码,所以会一直报错说NOAUTH认证需要。后来,在改篇文章的评论中有如下:#1楼 2016-12-2814:21 破壁人  您好按照您的方式进行了修改,但是问题依然出现报错,NOAUTHAuthenticatio…

    2022年9月5日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号