sed 基础语法

1. 基本介绍

  • sed 是Stream Editor 的缩写,简称流编辑器;用来处理文件。
  • sed 是一行一行读取文件内容并按照要求进行处理,把处理后的结果输出到屏幕
  • sed 首先读取文件中的一行内容,把其保存在一个临时缓冲区中。然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上
  • sed 把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改源文件
  • sed 主要用来自动编辑一个或多个文件;简化对该文件的反复操作,对文件进行过滤和转换操作

2. sed 语法结构

sed 常见的语法格式有两中,一种为命令行模式,另一种为脚本模式

2.1. 命令行格式

sed [options]  ' 处理动作 ' 文件名
2.1.1. 常用选项

-[e] 进行多次编辑
-[n] 取消默认输出,不自动打印模式空间
-[r] 使用扩展正则表达式
-[i]修改源文件
-[f]指定 sed 脚本的文件名

  • 学习案例

    # chen @ localhost in ~/Shell [13:39:51] 
    $ sed -ne '/root/=' -ne '/root/p' passwd
    1
    root:x:0:0:root:/root:/bin/zshi	
    
    # 在 passwd 文件中的第5行的前面加入 "hello world " 同时在 passwd 文件中的第8行下面插入"hello java" 
    # chen @ localhost in ~/Shell [13:50:10] 
    $ sed -e '2ihello world' -e '5ahello java'  passwd           
    root:x:0:0:root:/root:/bin/zshi	
    hello world
    in:x:1:1:bin:/bin:/sbin/nologin
    ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync	
    hello java
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    

注意:

  • -ni不要一起使用
  • p命令,不要在使用-i时使用
2.1.2. 常见动作

注意: 动作必须位于单引号中

p打印
i 在指定行之前插入内容
o 在指定行之后插入内容
c替换指定行所有内容
d删除指定行

2.1.3. 学习示例
  • 示例数据

    # chen @ localhost in ~/Shell [11:14:06] 
    $ cat -n passwd
         1	root:x:0:0:root:/root:/bin/zshi	
         2	in:x:1:1:bin:/bin:/sbin/nologin
         3	ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
         4	adm:x:3:4:adm:/var/adm:/sbin/nologin
         5	sync:x:5:0:sync:/sbin:/bin/sync	
         6	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    
  • passwd文件进行增删改查操作

    • 打印文件内容

      # 打印文件所有内容
      # chen @ localhost in ~/Shell [11:15:12] 
      $ sed -n 'p' passwd
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      # 打印文件第一行
      # chen @ localhost in ~/Shell [11:15:26] 
      $ sed -n '1p' passwd
      root:x:0:0:root:/root:/bin/zshi	
      # 打印文件第一至三行
      # chen @ localhost in ~/Shell [11:16:02] 
      $ sed -n '1,3p' passwd
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      # 打印文件最后一行
      # chen @ localhost in ~/Shell [11:16:06] 
      $ sed -n '$p' passwd
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
    • 增加文件内容

      # chen @ localhost in ~/Shell [11:16:11] 
      $ sed '$ahello' passwd  # 在文件最后一行之后增加hello
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      hello
      
      # chen @ localhost in ~/Shell [11:19:07] 
      $ sed 'ahello' passwd  # # 在文件每行之后增加hello
      root:x:0:0:root:/root:/bin/zshi	
      hello
      in:x:1:1:bin:/bin:/sbin/nologin
      hello
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      hello
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      hello
      sync:x:5:0:sync:/sbin:/bin/sync	
      hello
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      hello
      
      # chen @ localhost in ~/Shell [11:19:17] 
      $ sed '5ahello' passwd # 在文件第5行之后增加hello
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      hello
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
      # chen @ localhost in ~/Shell [11:19:26] 
      $ sed '$ihello' passwd # 在文件最后一行之前增加hello
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      hello
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
      # chen @ localhost in ~/Shell [11:19:37] 
      $ sed 'ihello' passwd  # 在文件每行之前增加hello
      hello
      root:x:0:0:root:/root:/bin/zshi	
      hello
      in:x:1:1:bin:/bin:/sbin/nologin
      hello
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      hello
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      hello
      sync:x:5:0:sync:/sbin:/bin/sync	
      hello
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
      # chen @ localhost in ~/Shell [11:19:46] 
      $ sed '/^root/ihello' passwd # 在文件最以root开头的行之前增加hello
      hello
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
    • 修改文件内容

      - # chen @ localhost in ~/Shell [12:34:16] C:1
      $ sed '5chello world' passwd # 替换第5行内容为 hello world
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      hello world
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
      # chen @ localhost in ~/Shell [12:34:36] 
      $ sed 'chello world' passwd  # 将每行内容替换为 hello world
      hello world
      hello world
      hello world
      hello world
      hello world
      hello world
      # chen @ localhost in ~/Shell [12:35:05] 
      $ sed '1,3chello world' passwd # 将1到3行内容替换为 hello world
      hello world
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      # chen @ localhost in ~/Shell [12:36:07] 
      $ sed '/^in/chello world' passwd # 将以in开头的数据替换为 hello world
      root:x:0:0:root:/root:/bin/zshi	
      hello world
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
    • 删除文件内容

      # chen @ localhost in ~/Shell [12:36:13] 
      $ sed '1d' passwd  # 删除文件第一行          
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      # chen @ localhost in ~/Shell [12:41:48] 
      $ sed '1,5d' passwd # 删除文件1至5行
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      
      # chen @ localhost in ~/Shell [12:42:21] 
      $ sed '$d' passwd # 删除文件最后一行
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      
      
  • passwd文件进行搜索替换操作

    语法:sed [选项] **' s/搜索'**
    其中。s表示 search搜索;斜杠/表示分隔符。可以自己定义;动作一般为打印p和全局替换g

    # chen @ localhost in ~/Shell [12:48:57] 
    $ sed -n 's/adm/ADM/gp' passwd
    ADM:x:3:4:ADM:/var/ADM:/sbin/nologin
    # chen @ localhost in ~/Shell [12:50:11] 
    $ sed -n 's/\/sbin\/nologin/chen/gp' passwd  # 将/sbin/nologin 替换为 chen
    in:x:1:1:bin:/bin:chen
    ddaemon:x:2:2:daemon:/sbin:chen
    adm:x:3:4:adm:/var/adm:chen
    # 注意:搜索替换中的分隔符可以自己搞定
    # chen @ localhost in ~/Shell [12:50:59] 
    $ sed -n 's@/sbin/nologin@chen@gp' passwd  
    in:x:1:1:bin:/bin:chen
    ddaemon:x:2:2:daemon:/sbin:chen
    adm:x:3:4:adm:/var/adm:chen
    
  • 其他命令

    r 从另外文件中读取内容
    w内容另存为
    &保存查找串在替换串中引用,和()相同
    =打印行号
    !对所选行以外的所有行应用命令,放到行数之后
    q退出

    • 学习示例
      # chen @ localhost in ~/Shell [13:34:08] 
      $ sed '3r ./hostname' passwd
      root:x:0:0:root:/root:/bin/zshi	
      in:x:1:1:bin:/bin:/sbin/nologin
      ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
      localhost.localdomain
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync	
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      # 将passwd 文件中的1到5行保存至11.txt文件中
      sed '1,5w 11.txt' passwd 
      # chen @ localhost in ~/Shell [13:36:07] 
      $ cat -n 11.txt 
           1	root:x:0:0:root:/root:/bin/zshi	
           2	in:x:1:1:bin:/bin:/sbin/nologin
           3	ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
           4	adm:x:3:4:adm:/var/adm:/sbin/nologin
           5	sync:x:5:0:sync:/sbin:/bin/sync
      # chen @ localhost in ~/Shell [13:39:10] 
      $ sed -n '1,5s/adm/&# /gp' passwd # 将adm 替换为adm#
      adm# :x:3:4:adm# :/var/adm# :/sbin/nologin
      
2.1.4. sed 结合正则使用
  • 语法结构:sed 选项 ' sed 命令 | 正则表达式 | 地址定位 ' 文件名

    /key/ 查询包含关键字的行
    /key1/,/key2/匹配两个关键字之间的行
    /key/,x从匹配关键字的行开始到文件第x行之间的行(包含关键字所在行)
    x,/key/从x行开始到关键字的匹配行之间的行
    x,y! 不包含x到y行

  • 定址用于决定对那些行进行编辑。地址形式可以是数字、正则表达式或二者的结合

  • 如果没有指定地址,sed将处理输入文件的所有行

  • 学习案例

    # chen @ localhost in ~/Shell [14:09:02] 
    $ sed -nr '3,/^shut/p' passwd 
    ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync	
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    

2.2. 脚本格式

2.2.1. 用法
sed -f scripts.sh file # 使用脚本处理文件
# 脚本的第一行
#!/bin/sed -f
2.2.2. 注意事项
  • 脚本文件是一个 sed 的命令行清单。
  • 在每行的末尾不能有空格、制表符或其他文本
  • 一行中有多条命令时,应该以分号分隔
  • 不需要并且不能用引号保护命令
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值