28、sed 模式分隔符

到目前为止,我们只使用过一种 分隔符,那就是 反斜杠(/)

假设我们需要使用 sed 将输入源中的 /bin/sed 替换为 /home/penglei/bin/sed

因为/ 是模式分隔符,我们不得不对它进行转义,即 /。

[www.ddkk.com]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/penglei\/bin\/sed/'

运行结果如下

/home/penglei/bin/sed

结果看起来是正确的。但是整个 sed 命令看起来就有点难以阅读了。更何况一个不小心,就会把替换的命令写错。

当我看到

s/\/bin\/sed/\/home\/penglei\/bin\/sed/

我头皮都麻了。

这,这,这...

难道没有其它的分隔符了吗?

估计sed 的开发人员也遇到了这个问题吧。

其实sed 允许使用其它的分隔符的,比如

  • 竖线(|)
  • at 符号 (@)
  • 反引号(\)
  • 感叹号(!)

本章接下来的内容,我们就来简单介绍下这几种分隔符的用法

竖线 |

竖线(|) 应该是 反斜杠(/) 之外用的最多的分隔符了。

竖线能够显著改善 sed 模式语句的可读性。

例如上面的命令,我们使用竖线作为分隔符,则可重写为

[www.ddkk.com]$ echo "/bin/sed" | sed 's|/bin/sed|/home/penglei/bin/sed|'

运行结果如下

/home/penglei/bin/sed

@ 字符

@字符同样也可以作为分隔符,不过可读性就没有竖线那么高了。

[www.ddkk.com]$ echo "/bin/sed" | sed 's@/bin/sed@/home/penglei/bin/sed@'

运行结果如下

/home/penglei/bin/sed

看到s@ 和 sed@ ,这 TMD 是什么鬼啊,我个人感觉可读性变差了好多。

/home/jerry/src/sed/sed-4.2.2/sed

反引号(\)

反引号(\)同样可以作为分隔符,不过可读性差了些

[www.ddkk.com]$ echo "/bin/sed" | sed 's^/bin/sed^/home/penglei/bin/sed^'

运行结果如下

/home/penglei/bin/sed

看到 反引号(\) ,我们第一个想到的是什么?

对,就是正则表达式中的 匹配行首

因此,可读性和可理解性那就更差了。

个人觉得最差,没有之一。

感叹号 !

感叹号(!) 同样可以作为分隔符。可读性和可理解性都是差到了极点了。

[www.ddkk.com]$ echo "/bin/sed" | sed 's!/bin/sed!/home/penglei/bin/sed!'

运行结果如下

/home/penglei/bin/sed

看到 感叹号(!) ,你第一个想法是什么? 这不就是 条件测试 中的 取反 么?

这个可读性和理解性,可以和 反引号(\) 有的一拼了。

结论

sed除了支持 反斜杠(/) 这一种分隔符,还支持其它的分隔符。

但我们最推荐的,还是 竖线(|)