sed 是一个命令,更是一个有趣的文本编辑器。这类编辑器有时也可以称为“行编辑器”。
所谓“行编辑器”,是指它每次只编辑一行。这使得它的结构很简单,简单到文本编辑也可以成为一种思维考验。
sed 中用于存储文本的地方只有两个区域:
就是靠这仅有的两个 SPACE 使得 SED 可以完成一些复杂的文本编辑操作。这些操作往往借助巧妙的时间、空间管理来完成。
对于这种仅利用时间和两个空间的文本编辑,时常让我感觉到一种精微中的宏大。所谓”一花一世界,一沙一乾坤。掌中握无限,刹那在永恒”。
# Sed Diagram (Sed 概览图) # by Sean Zhang (http://noyesno.net/) at Feb, 2011 Address: // , Regexp: \{m,n\} \(\) \1 \2 ... \9 +----------------+ | Input | +----------------+ | | | +-------V--------+ +--------------+ s y d D | |---h H--->| | ----------->| Pattern Space |<----x--->| Hold Space | b t N | |<--g G----| | +----------------+ +--------------+ | q | n N p P r w = a\ c\ i\ | +-------V--------+ | Output | +----------------+
g
表示全局替换tr
命令假设有下面的文件内容
aaa bbb ccc ddd
# grep for AAA and BBB and CCC (in any order) sed '/AAA/!d; /BBB/!d; /CCC/!d' # grep for AAA or BBB or CCC (emulates "egrep") sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
上面利用了两个不常用的控制命令:
!
: 表示对不匹配模式的行进行操作b
: 是分支跳转命令(branch),省略要跳转到的label时,则跳转到程序的结束把包含字符串"ccc"的前一行的内容替换为 “bingo”
sed '/ccc/ {x ; s/.*/bingo/; x} ; x ; 1 d ; $ G'
x
的作用x
用于替换存储在Hold Space的前一行1
和 $
两个模式用来处理文件开始(空行)和结束行(最后一行还在Hold Space中)