sed 是 shell 编程中很常见的流编辑命令,主要用于批量替换。
sed 的默认编辑单位是『行』,如果要处理的信息分布于多个行中,需要考虑多行处理命令:N、P、D。click here, nice tutorial
考虑以下情景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
如果一行以 one 结尾,而且下一行以 two 开头,那么就把这两个邻接行拼接成一行,并把 one two 替换为 1 2。
在只了解 N、P、D 之后,想出一个比较有意思的解决方案:
1 2 3 4 5 6 7 8 9 10 11 |
|
表达式 s/a/b/ 中,查找字符串 a 如果包含回车符,用 \n
表示。但是如果替换字符串 b 中如果包含回车符,需要用 \ + 回车
表示。并且回车后的替换内容要顶头,不能排版加空格、tab1。
以上解决方案的关键点在于替换时在开头又加了一个换行符,如此后面执行 D 则删除了模式空间中的这个空行,继续读入下一行处理,以此达到循环处理的目的。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
后面了解了 t 命令后,更直接的解决方案如下:
1 2 3 4 5 6 7 8 9 10 11 |
|
t 命令相当于一个 while,当 t 之前最近的一个 s/a/b/ 命令匹配成功时,继续循环。得到同样的运行结果。
此小实例只做趣味讨论,shell 中的流处理2都是面向行3为单位的,对于内容有 overlap 的循环处理,效率低且不好用。