小感一点
一、砖头勾引和田玉
先说点自己对sed的目前掌控吧,sed是一个文本流编辑器,逐行处理文件。默认情况下并不直接改变原本文件内容(除非使用-i选项)。
sed工作有两个空间pattern space和holding space。
pattern space, sed逐行将文本行拿出,置于pattern space中,然后做相应处理,默认操作是对每一个经过pattern space的行做输出至屏幕操作(-n选择静默模式不打印pattern space中没有被打印的行,仅仅打印被匹配的行)。
hold buffer空间,选用h操作就能将在pattern space中被匹配到的内容复制一份到hold buffer中并且覆盖原有hold buffer的记录。选用H操作就追加一行内容到hold buffer中,况且,每当使用H操作时,hold buffer默认会有一行的预留空间。
能用sed实现奇偶行调换,也算是对sed有了中级认识,原理就像C语言实现两个变量互换值域一样,先将要调换的拿出来,放入另一个区域中,再做操作,然后再操作初始值。
例:用sed这样实现
#sed -e ‘1~2{h;d;}‘ -e ‘{G}‘ testfile
命令流程和操作过程如下图
testfile文件
用h操作
用H操作
二、记录下sed的通用格式和部分选项及其command
sed [options] ‘[address]|[/pattern/][actions]‘ FILE
address
first~step
1,$
/BRE1/,/BRE2/
pattern /BRES/
actions
a \string
i \string
c \string
h 将结果暂存于holding buffer
G 调用holding buffer中的数据至pattern space中,再打印。
[1,3]s ///
r filename 把filename放置到匹配前面address或者pattern的后面
q 找到地址后面就退出
s/pattern/string/[g p w i]
此命令只替换被模式匹配到的字符本身,要是替换整行用 /pattern/c \string
g 默认只替换第一次被模式匹配到的内容,要全局修改用g
p 打印该变动行
i 忽略大小写去搜索
w filename 重定向输出该行到制定文件夹。如‘s///w sed.out‘
#sed ‘s/\(l..e\)/\1r/g‘ sed.txt
若只将 love改为Love
#sed ‘s/l\(..e\)/L\1/g‘ sed.txt
将行首的至少一个空格字符删除
#history | sed ‘s#^[[:space:]]+##g‘
三、小点仅作自己记忆参考
小点一、关于addresss
first~step 从第一行开始,每两步匹配一次,或是说每两行执行一次后续操作,如下例,没两行执行一次{h;d},也就是说只有第一行被放入holding buffer,第二行执行默认操作(输出)。
例子
#sed -e ‘1~2{h;d;}‘ -e ‘{G;}‘ /etc/inittab
小点二、sed的替换用于修改字符串。
这种情况通常是比较恶心的,尤其是锚定前后字符串的,比如把/etc/inittab 中id:3:initdefault中的冒号中间的数字换成5
方法一、(&)
#sed ‘s/l..e/&r/g‘ sed.txt
方法二、(后向引用)
#sed ‘1,$s/\(id:\)[0-9]\(:initdefault:\)/\15\2/g‘ /etc/inittab
小点三、sed脚本格式
#vim script.sed #!/bin/sed #name #replace the first line with a "hello" 1 c\ hello #replace the last line with a "hello" $ c\ hello #add "hello" upon which "evening" been matched. /eventing/ i\ hello #add "hello" after 3th line. 3 a\ hello #sed -f script.sed /etc/inittab
一点小见解,前面的关于sed引用空间的见解完全是自己摸索,但是不知道是否正确,恳请各位大牛多多指正。