Linux-sed

作用

采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。

sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。

当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

语法

sed [-nefri] [n1[,n2]]function

参数

选项含义
-e该选项会将其后跟的脚本命令添加到已有的命令中。
-f filename该选项会将其后文件中的脚本命令添加到已有的命令中。
-n安静模式。在sed的一般用法中,所有来自文件中的数据都会被列出到屏幕上,如果加上-n,则只有经过sed特殊处理的那行(或操作)才会被列出来。
-r使用扩展正则表达式
-i此选项会直接修改源文件,要慎用。
  • [n1[,n2]]
    表示选择操作的行数
  • function
    i :插入,在目标行的上面新增一行。
    a :插入,在目标行的下面新增一行。
    d :删除所选行。
    p :打印,也就是将某个选择的数据打印出来,通常参数-p与参数-n搭配使用。
    s :替换,可以直接进行替换的工作。
    c :替换,c的后面可以接替字符串,这些字符串可以替换n1,n2之间的行。
    w :写并追加模板块到file末尾。
    W : 写并追加模板块的第一行到file末尾。
    ! :表示后面的命令对所有没有被选定的行发生作用。
    = :打印当前行号; # 把注释扩展到下一个换行符以前。

sed s 替换脚本命令 基本格式为:

[n1[,n2]]s/pattern/replacement/flags

sed s替换脚本命令支持正则表达来匹配旧的字符串。

flags 标记功能
n1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file将缓冲区中的内容写到指定的 file 文件中;
&用正则表达式匹配的内容进行替换;
\n匹配第 n 个子串,该子串之前在 pattern 中用 \(\) 指定。
\转义(转义替换部分包含:&、\ 等)。

使用实例

以行为单位的新增删除功能

[root@Ethan ~]# last | nl | head -n 5
     1  root     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
     2  root     pts/1        117.80.141.145   Fri Mar 20 08:41   still logged in   
     3  root     pts/0        117.80.141.145   Fri Mar 20 07:44   still logged in   
     4  root     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)    
     5  root     pts/2        183.209.104.137  Sat Mar 14 19:40 - 22:20  (02:39)    

删除行

[root@Ethan ~]# last | nl | head -n 5 | sed '2,3d'
     1  root     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
     4  root     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)    
     5  root     pts/2        183.209.104.137  Sat Mar 14 19:40 - 22:20  (02:39)    

新增行

[root@Ethan ~]# last | nl | head -n 5 | sed '2,3a New Line'
     1  root     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
     2  root     pts/1        117.80.141.145   Fri Mar 20 08:41   still logged in   
New Line
     3  root     pts/0        117.80.141.145   Fri Mar 20 07:44   still logged in   
New Line
     4  root     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)    
     5  root     pts/2        183.209.104.137  Sat Mar 14 19:40 - 22:20  (02:39) 

新增多行数据,以“\”来换行。

[root@Ethan ~]# last | nl | head -n 5 | sed '2,3a New Line1\
> New Line2'
     1  root     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
     2  root     pts/1        117.80.141.145   Fri Mar 20 08:41   still logged in   
New Line1
New Line2
     3  root     pts/0        117.80.141.145   Fri Mar 20 07:44   still logged in   
New Line1
New Line2
     4  root     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)    
     5  root     pts/2        183.209.104.137  Sat Mar 14 19:40 - 22:20  (02:39)  

以行为单位的替换与显示功能

多行替换

[root@Ethan ~]# last | nl | head -n 5 | sed '2,3c New Line'
     1  root     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
New Line
     4  root     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)    
     5  root     pts/2        183.209.104.137  Sat Mar 14 19:40 - 22:20  (02:39)

输出指定行

[root@Ethan ~]# last | nl | head -n 5 | sed -n '2,3p'          
     2  root     pts/1        117.80.141.145   Fri Mar 20 08:41   still logged in   
     3  root     pts/0        117.80.141.145   Fri Mar 20 07:44   still logged in  

部分数据的查找并替换功能

[root@Ethan ~]# last | nl | head -n 5 | sed 's/root/admin/g'
     1  admin     pts/3        117.80.141.145   Fri Mar 20 09:43   still logged in   
     2  admin     pts/2        117.80.141.145   Fri Mar 20 09:17   still logged in   
     3  admin     pts/1        117.80.141.145   Fri Mar 20 08:41   still logged in   
     4  admin     pts/0        117.80.141.145   Fri Mar 20 07:44   still logged in   
     5  admin     pts/0        183.209.104.137  Sun Mar 15 16:32 - 18:51  (02:19)   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值