MacOS流编辑器sed

816

往期文章

寻找IOS相册中相似图片
NSNotification与类对象,实例对象
iCloud-Documents存储
CocoaPods私有源搭建
Swarm区块链分布式存储使用

sed简介

sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

sed工作原理

sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出

image.png

因为sed涉及到正则表达式提取文本内容,所以这里特别强调下正则表达式的概念

正则表达式概念

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具,换句话说,正则表达式就是记录文本规则的代码。许多程序设计语言都支持利用正则表达式进行字符串操作。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本

正则表达式匹配过程

简单描述一下正则表达式的匹配过程,就是拿正则表达式所表示的字符串去和原文字符串内容去匹配,直到匹配到原文内容字符串中的一个完整子串就表示匹配成功。举个例子,有一行文件内容"this is better desk",这里用"esk"去匹配,匹配过程是这样的:首先拿e去匹配文件行内容,从this开始,直到better的e,第一个字符匹配成功,接着s去匹配better字符e后边的t字符,没有匹配成功;然后重新拿esk中的e去和better的第二个t去匹配,没有成功,接着原始内容的下一个字符,直到desk中的e字符,逐个匹配s,k字符,到此为止,esk成功匹配,正则表达式匹配完毕,整个过程就是这样,即使再复杂的正则表达式的匹配过程也是按照此过程来进行的。

sed简单使用

命令结构

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

- e <script> 或--expression=<script>以选项中指定的script来处理输入的文本文件
- f <script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- h 或--help 显示帮助。
- n 或--quiet--silent 仅显示script处理后的结果。
- V 或--version 显示版本信息。

操作

  • a :新增
  • c :取代
  • d :删除
  • i :插入
  • p :打印
  • s :取代

sed 正则表达式

符号作用
.匹配任意一个字符,除了换行符,但是需要注意的是,在sed中不能匹配换行符,但是在awk中可以匹配换行符。类似shell通配符中的"?",匹配一个任意字符。
*表示前边字符有0个或多个。"."表示任意一个字符有0个或多个,也就是能匹配任意的字符。类似shell通配符中的"",可以匹配任意字符。
[][a-z]:表示a-z字符中的一个,也就是小写字母。[0-9]:表示0-9字符中的一个,也就是表示数字。
表示行首的意思,也就是每一行的开始位置。在这里并不是上边字符范围中取反的意思,^符号只有在"[]"符号的开头处才能表示字符取反 ^abc:表示以abc开头的字符串abc。^abc.*:表示以abc开头的字符串abcxxx。
$表示行尾的意思,也就是每一行的结尾位置,很好理解,和"^"正好相反。
\""表示是转义字符 其它语言中用到的转义字符意义基本上是一样的,就是把元字符转义为普通字符,把普通字符转换为特殊意义符号
{}表示前边字符的数量范围,大概有三种用法

sed替换文本内容

命令为 see -i "" "s/旧内容/新内容/g" 操作文件路径 /g表示替换所有文本中的旧内容,如果没有/g则。只替换一次

sed -i "" "s/s.version\([ ]\{1,\}\)=\([ ]\{1,\}\)\([\'|\"]\)\([^\"]\{1,\}\([\'|\"]\)\)/s.version = \"$BundleVersion\"/g"   s.version = "0.0.9"

正则目标匹配为 s.version = "0.0.8" 匹配表达式如下

s.version\([ ]\{1,\}\)=\([ ]\{1,\}\)\([\'|\"]\)\([^\"]\{1,\}\([\'|\"]\)\)
拆分如下
\([ ]\{1,\}\) 表达只出现一次的空格
\([ ]\{1,\}\) 表达只出现一次的空格
\([\'|\"]\)  表示只出现一次的” 或者 ‘ 
\(    [^\"]\{  1, \}\([\'|\"]\)   \)   表示不为"的字符至少出现一次,并且以"或者''结尾的
[^"]{1,}表示以非"开头的字符,出现至少一次