sed 指令的使用

首先安利macOS的终端指令mas —— mac app store的命令行版

mas 使用说明:

假如我们闲着没事干, 想提取一下mac app store里‘ABC’的搜索结果, 只需要输入:

输出的结果中包含App的ID(前面的数字)以及版本号(括号里的内容)

假如又闲着没事干, 只想保存App的名字, 这时候就要用到sed命令:

上图的命令为(后文讲述如何简写):

  • mas search ABC | sed 's/[0-9]//g' | sed 's/(//g' | sed 's/\.//g' | sed 's/)//g'

mas 指令就是上文提到的mac app store的命令行版本

| 符号为管道符, 用于将上一条指令的输出传递给下一条指令, 作为其输入, 这是命令行非常常见的操作

后面的四条sed命令即对搜索结果进行了四次匹配和替换操作

sed 的串匹配用到了正则表达式, 这里不再详述正则

分析一条sed语句时, 要以三个斜杠为界来看单引号内的内容, 比如:

  • sed ‘s/[0-9]//g’

开头的s代表替换操作, 所以实际上需要联系头部字符来判断斜杠处的操作

三个斜杠中分割的内容为‘[0-9]’和‘’, 在sed命令中, 这表示将数字(正则表达式为[0-9])替换为空串(即‘’)

尾部的字符代表操作的选项, 此处为g, 即全面替换标记. 相似的还有d(删除)、p等操作, 这里没有用到

sed的指令规范即:

  • sed ‘[操作类型] / [匹配串] / [替换串] / [操作选项]’

sed如同各种高级语言中的str.replace()方法

回到命令:

  • mas search ABC | sed 's/[0-9]//g' | sed 's/(//g' | sed 's/\.//g' | sed 's/)//g'

后面的操作其实就是将数字、左括号、小数点、右括号全部替换为空串, 达到去掉ID和版本号的效果

连续写四个sed很费力, 我们可以用一条sed命令匹配所有的内容:

图中将原本四条sed指令融合为:

  • mas search ABC | sed 's/[0-9]//g; s/(//g; s/\.//g; s/)//g'

在sed中,

  • sed ‘[指令]; [指令]; [指令]; [指令]’

等价于:

  • sed [指令] | sed [指令] | sed [指令] | sed[指令]

也就是说, 可以通过在规则后加分号, 让sed匹配多个规则

对于本例, 语句还可以被缩减为:

  • mas search ABC | sed 's/[0-9]//g; s/(.*//g'

即取消了点和右括号的匹配并加入了.*, 这是因为在替换了数字后, 版本号只剩括号和小数点, 而‘(.*’可以删除以左括号开头的剩余字符串