zoukankan      html  css  js  c++  java
  • linux中sed命令的使用

      最近需要造一个大容量的文本文件,发下sed工具就是对文本文件操作的,故学习一下。

      sed是一个非交互式的文本编辑器,它可对文本文件和标准输入进行编辑。

      标准输入有以下来源:

      • 键盘输入
      • 文件重定向
      • 字符串
      • 变量
      • 管道

      sed从文本的一个文本行或标准输入读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号编辑,重复此过程直至命令行或脚本中的所有命令结束。

      相对于vi编辑器,它的执行效率高,可以一次性处理所有编辑任务。sed的使用场合如下:

      • 编辑相对交互式编辑器而言太大的文件;
      • 编辑命令太复杂,在交互式编辑器中难以输入;
      • 需要执行多个函数才能完成对文件的扫描

      可以通过3种方式调用sed命令:

    1. 在命令行输入命令调用sed,格式:sed [选项] 'sed命令' 输入文件;
    2. 将sed写入脚本,然后通过sed命令调用 格式:sed [选项] -f sed脚本文件 输入文件;
    3. 将sed写入脚本,并设置为可执行脚本。

          不管哪种调用方式,如果没有指定输入文件,将从标准输入中接收数据,sed常用的选项如下:

    选项                                                      意义
    -n 不打印所有行到标准输出
    -e 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,该选项可以省略
    -f 表示正在调用sed脚本

    sed通常由定位文本行和编辑命令组成,编辑命令对定位文本行进行处理,sed提供了两种定位文本的方式:

      • 使用行号,指定一行或行范围;
      • 使用正则表达式。

    sed定位文本的方式:  

    选项 意义
    x x为指定行号
    x,y 指定从x到y的行号范围
    /pattern/ 查询包含模式的行
    /pattern/pattern/ 查询包含两个模式的行
    /pattern/,x 查询从匹配行到x行之间的行
    x,/pattern/ 查询从x行到匹配行之间的行
    x,y! 查询不包括x和y行号的行

    sed编辑命令:

    选项 意义
    p 打印匹配行
    = 打印文件行号
    a

    在定位行号之后追加文本信息

    i 在定位行号前插入文本信息
    d 删除定位行
    c 用新文本替换定位文本
    s 使用替换模式
    r 从另一个文本中读取
    w 将文本写入到文件中
    y 变换字符
    q 第一个模式匹配完成后退出
    l 显示与八进制ASCII码等价的控制符
    {} 在定位行执行的命令组
    n 读取一个输入行,用下一个命令处理新的行
    h 将模式缓冲区的文本复制到保持缓冲区
    H 将模式缓冲区的文本追加到保持缓冲区
    x 互换模式缓冲区与保持缓冲区的内容
    g 将保持缓冲区的内容复制到模式缓冲区
    G 将保持缓冲区的内容追加到模式缓冲区

    下面举一些例子:

    新建一个文本 test.sh.输入如下内容:

    hello world
    I want to find the good person
    best wishes
    spal xiang
    welcome to my home

    Do you want a pensel?yes,I want one.

    1.sed -n '1p' test.sh --打印输入文件的第一行

    2.sed -n '/world/p' test.sh --打印输入文件中与world文本匹配的行

    3.sed -n '3,6p' test.sh --打印输入文件的3,6行

    4.sed -n -e '/world/=' -e '/world/p' test.py --打印输入文件中与world匹配的行号和内容,编辑命令不能组合使用

    #这里“=”将匹配的行号输出,“p”指讲匹配的行内容输出,“-n”指不打印所有内容,只打印匹配到的,/world/指查询包含world的行 -e后面的字符串为编辑命令

    5.sed '/world/aI am adding a new line' test.py --在指定位置追加内容,可以通过匹配或行号方式指定位置

    6.追加内容也可以通过脚本add.sed的方式实现:

      #!/bin/sed -f

      /world/a 

      I am adding a new line,

      I am add another line.

      给脚本add.sed赋执行权限,执行./add.sed test.sh即可。

    7.sed -n '/?/p' test.sh --打印匹配元字符?的行,输入文件中含有元字符的需要用""转义。

    8.sed -n '$p' test.sh --打印输入文件的最后一行。

    9.sed -n '3,$p' test.sh --打印第三行到最后一行的内容。

    10.sed -n '/.*ome/p' test.sh --打印以ome结尾的行。

    11.sed -n '3,6!p' test.sh --打印不在3,6行的内容,!不能与模式匹配结合使用。

    12.sed '/world/iI am insert into a new line to this file' test.sh --插入文本,在匹配的行前面插入内容,脚本调用方式和a类似。

    13.sed '/world/cI am replace this line now' test.sh --修改匹配到的文本行,脚本调用方式和a类似。

    14.sed '/world/d' test.sh --删除匹配的文本行。

    15.sed '3,$d' test.sh--删除文本第3行到最后一行。

    16.sed '/[wW][oO][Rr][lL][Dd]/d' test.py --删除world匹配到的包含大小写的所有行

    17.sed 's/world/Beijing/g' test.py --替换文本,与修改c的区别是s修改的是字符串,而不是整行,该选项可以结合g p w灵活替换,不加g时只替换每一行第一个匹配到的字符串。

    18.sed -n 's/world/faimly/2p' test.py --可以指定每一行中第几次匹配到的字符串替换。

    19.sed -n 's/world/faimly/1w test.bat' test.sh --替换第一个匹配到的字符串,并将替换行输出到test.bat中。

    20.sed -n 's/world/(&)/p' test.py --&代表被匹配的字符串。

    21.sed -n '1,5 w test.bat' test.py --将指定范围的行输出到新文件。

    22.sed -n '/.r.*/p' test.py --匹配字符串中含有r的行。

    23.sed -n '/.r.*/q' test.py --q指只要匹配到指定的字符串的行就退出。

    24.sed -n '1,$l' test.py --显示输入文件中的控制字符。

    25.sed -n '/world/{=;p}' test.py --{}内存放编辑命令组。

    26.sed -n '/world/{s/he/11/p;s/th/22/pg}' test.sh --替换与world匹配的行中的he为11,th为22。

    27.sed '/world/{n;s/want/have/g;}' test.sh --匹配到输入文件中含有world的行,然后替换该行的下一行中的want为have。

    还有一些关于模式缓冲区和保持缓冲区内容复制,追加,切换的命令,这里就不一一举例了。

  • 相关阅读:
    基于maven的javaweb项目模块化开发
    ramoops具体失败原因来解释驱动寄存器
    REQIMPORT-购买内部应用程序(R12.2.3)
    iOS_动态插入或删除行
    leetcode:pascal's_triangle_II
    设计模式-----观察者模式(Obsever)
    org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Propertie
    Unity3D-RPG项目实战(1):发动机的特殊文件夹
    NYOJ 372 巧克力的
    LeetCode Solutions : Reorder List
  • 原文地址:https://www.cnblogs.com/confident1012/p/6040072.html
Copyright © 2011-2022 走看看