1. sed 如何工作的
sed 维护两个空间:
- 模式空间
- 保留空间
sed是以行为周期来处理文本的。
- sed从输入流中读取一行,去掉最后的换行符,把它放入模式空间。
- 随后执行命令,每个命令都有关联的地址和条件,只有匹配时才执行命令。
- 当脚本命令执行完后,模式空间的内容被打印到输出流中(-n选项不出现),在最后加上换行符。
- 回到1
一般情况下,模式空间的内容在进行下一次循环时会删除;而保留空间则不会。
2. 多行处理技巧
多行处理命令
- D 从模式空间删除一行,重新开始循环
- G 从保留空间拿一行加到模式空间最后
- H 从模式空间拿一行加到保留空间最后
- N 从输入文件中拿一行加到模式空间
- P 输出模式空间的第一行内容
命令看不懂还是直接看脚本吧
- 打印相邻两行
$ seq 6 | sed -n 'N;l;D'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
多读取一行,再打印,最后删除第一行。
- 处理段落
sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
前面的表示,非空行的时候把模式空间的东西放到保留空间。
x
表示把保留空间内容复制到模式空间;
空行的时候再执行查找替换命令。
- n与N区别
printf '%s\n' aa bb cc dd | sed ':x ; n ; = ; bx'
printf '%s\n' aa bb cc dd | sed ':x ; N ; = ; bx'
printf '%s\n' aa bb cc dd | sed ':x ; n ; s/\n/***/ ; bx'
printf '%s\n' aa bb cc dd | sed ':x ; N ; s/\n/***/ ; bx'
n
命令先打印模式空间内容,再清空它;再读取下一行内容。
N
命令先将读入的下一行放入模式空间,累计读取的内容,最后打印。
3. 分支与循环
上面的其实已经用到了循环
b
无条件跳转t
条件成立时跳转T
条件不成立时跳转:
标号
还是看脚本吧
- 合并行
sed ':x ; /=$/ { N ; s/=\n//g ; bx }' jaques.txt
另一种写法
sed ':x ; $!N ; s/=\n// ; tx ; P ; D' jaques.txt
- sed去换行符
sed ':a;N;$!ba;s/\n//g' file
$!
最后一行的意思
4. ref
gnu_sed