博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【一天一个shell命令】文本内容操作系列-sed-简介
阅读量:6623 次
发布时间:2019-06-25

本文共 2261 字,大约阅读时间需要 7 分钟。

说明:

sed是stream editor(流编辑器)的缩写。它能够完美匹配正则表达式。sedawk是文件编辑最重要的两个命令了。尤其涉及到了很多正则表达式的问题,笔者不敢也有点犯怵,试着写写。

 实例:

1.替换文件中的字符串

$sed -i 's/text/replace/g' file

#如果不加g结尾,则替换每一行的第一个

#如果只是打印,去掉-i

2.忽略前N处匹配,从N+1出开始替换

$sed -i 's/text/replace/2g' file

#在g前面加入数字N

3.移除空白符

$sed '/^$/d' file

4.标记已匹配的内容

$echo this is an example | sed 's:\w\+:/[&]:g'

[this] [is] [an] [example]

#冒号是定界符,只要合适,定界符可以是任意的

5.子串匹配

$echo this is digit 7 in a number | sed 's:digit \(0-9\):\1:'

#输出:this is 7 in a number

#学过正则表达式的人,都理解group的概念,()里的内容是第一组,所以只打印了7

6.引用

$text=hello

$echo hello world | sed "s/$text/HELLO"

#输出HELLO world

#可能有人注意用双引号,是因为单引号会把$text当做一个字符串,而不是表达式。

7.删除

$sed '2d' file #删除第二行

$sed '2,$d' file  #删除2-最后一行

$sed '$d' file  #删除最后一行

解读—help

用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

  -n, --quiet, --silent 

                 取消自动打印模式空间 
  -e 脚本, --expression=脚本 
                 添加“脚本”到程序的运行列表 
  -f 脚本文件, --file=脚本文件 
                 添加“脚本文件”到程序的运行列表 
  --follow-symlinks 
                 直接修改文件时跟随软链接 
  -i[扩展名], --in-place[=扩展名] 
                 直接修改文件(如果指定扩展名就备份文件) 
  -l N, --line-length=N 
                 指定“l”命令的换行期望长度 
  --posix 
                 关闭所有 GNU 扩展 
  -r, --regexp-extended 
                 在脚本中使用扩展正则表达式 
  -s, --separate 
                 将输入文件视为各个独立的文件而不是一个长的连续输入 
  -u, --unbuffered 
                 从输入文件读取最少的数据,更频繁的刷新输出 
      --help     打印帮助并退出 
      --version  输出版本信息并退出

如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为 

sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准 
输入读取数据。

解读:

对于这个帮助信息,确实信息量非常不足,不过sed确实过于复杂,所以尝试分成几次来详解这个命令。

  

我再借用另一段帮助信息文档

调用sed命令有两种形式:

  • sed [options] 'command' file(s)
  • sed [options] -f scriptfile file(s)

options

  • a\   例如:sed "a\mm" file
  • 在当前行后面加入一行文本。
  • b lable
  • 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
  • c\
  • 用新的文本改变本行的文本。
  • d
  • 从模板块(Pattern space)位置删除行。
  • D
  • 删除模板块的第一行。
  • i\
  • 在当前行上面插入文本。
  • h
  • 拷贝模板块的内容到内存中的缓冲区。
  • H
  • 追加模板块的内容到内存中的缓冲区
  • g
  • 获得内存缓冲区的内容,并替代当前模板块中的文本。
  • G
  • 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
  • l
  • 列表不能打印字符的清单。
  • n
  • 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
  • N
  • 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
  • p
  • 打印模板块的行。
  • P(大写)
  • 打印模板块的第一行。
  • q
  • 退出Sed。
  • r file
  • 从file中读行。
  • t label
  • if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
  • T label
  • 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
  • w file
  • 写并追加模板块到file末尾。
  • W file
  • 写并追加模板块的第一行到file末尾。
  • !
  • 表示后面的命令对所有没有被选定的行发生作用。
  • s/re/string
  • 用string替换正则表达式re。
  • =
  • 打印当前行号码。
  • #
  • 把注释扩展到下一个换行符以前。

以下的是替换标记

  • g表示行内全面替换。
  • p表示打印行。
  • w表示把行写入一个文件。
  • x表示互换模板块中的文本和缓冲区中的文本。
  • y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

 

区别加斜杆与不加

例如: a\ 表示在a\后面加入内容,而d则在d前面加入表达式,1d表示删除1行。

本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/961904,如需转载请自行联系原作者
你可能感兴趣的文章
前端面试题-2
查看>>
cesium(相机)
查看>>
android 避免线程的重复创建(HandlerThread、线程池)
查看>>
手游-放开那三国socket协议分析
查看>>
Python学习第二天-编写三级菜单
查看>>
leetcode290
查看>>
003-对象——对象的释放 抽象 封装 继承 多态
查看>>
Cookies 题解报告
查看>>
Java中关于WeakReference和WeakHashMap的理解
查看>>
SQL Lazy Spool Eager Spool
查看>>
type的解释
查看>>
python之路--类与类之间的关系
查看>>
js冒泡排序
查看>>
CSS 居中
查看>>
未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序 解决方法
查看>>
global中捕获异常
查看>>
用户态和核心态(转)
查看>>
linux基础—课堂随笔08_进程
查看>>
QTcreator打包发布可运行程序(基于QT5.7)
查看>>
Servlet
查看>>