烦恼一般都是想太多了。

0%

sed几个有意思的例子

sed一般经常用做比较小的操作但是有时候也会遇到需要进行一些比较头疼的操作的时候,比如,反转行,反转文件等等。本节就对这些例子进行一个演示。

反转行

#!/usr/bin/sed -f

# 空行无条件跳转,也就是直接开始下一个循环。
/../! b

# 在行的前后加上换行符
s/^.*$/\
&\
/

# 跳转到标签 x,这里没有成功执行 s 命令,所以不会跳转过去。在 标签定义之前使用 t 命令,是为了重置条件
tx
# 标签定义及循环
:x
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/
tx

# 删除加到行内的换行符
s/\n//g

把上面这个程序存为 reverse.sed
我们以以下代码来进行说明:

$ cat tmp.txt
123456789

执行命令:

./reverse.sed tmp.txt
987654321

确实跟我们想象的一样。

为了更清楚的展示一下这个过程,我们在 s命令中加上一个p命令,也就是:

s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/p

然后再执行命令:

./reverse.sed tmp.txt
9
2345678
1

98
34567
21

987
456
321

9876
5
4321

987654321

可以看到,要反转的内容,永远都是被包含在 \n … \n 中的,通过对调 前一个 \n和其后的字符 及后一个\n和其后的字符 来保证永远在 \n … \n内。

反转文件内的行

注意,这个程序在非 GNU 的sed可能会溢出。

#!/usr/bin/sed -nf

# 第二行开始,把 hold buffer中的内容附到 模式空间
1! G

#在最后一行打印模式空间
$ p

# 把所有内容存到 hold buffer内去
h

流程是:

  • 读入第一行,然后放到 buffer
  • 读入第二行,然后把 buffer 附到 模式空间
  • 把模式空间存储到buffer
  • 清空模式空间,读入第三行,再把buffer的内容附到模式空间
  • …….
  • 最后一行,附加buffer内容
  • 打印出来