第3章 查找与替换——sed基础(上)

最近真是有够忙的,不过仔细想想自己其实一直处在这种状态中,,,各种东西要去学。走在路上脑中一会儿跳出个nesC,一会儿想起某个数据结构题,想着想着又会出现个在线雇佣问题k的计算。。然后到了吃饭的时候,又该想想java的多态和c++的对比以及shell的那几个易忘点。总之,生活越来越快节奏了,唯一能应对的办法只有更拼了。。
好吧,该做的还是得做。复习下sed基础,记下笔记。。
1.语法:

	sed [-n] 'editing command' [file……]
	sed [-n] -e 'editing command' [file……]
	sed [-n] -f script-file [file……]

2.s命令:用于替换(或删除)
sed ‘s/tom/bob/’ name.list 将文件name.list中的tom替换成bob
3.关于定界符:
定界符可以是标点或斜杠,用户可以根据需要选择(如:文件中已经有斜杠,但没有:时,可以用:作为定界符)
4.sed如果没有指定输入文件,则输入为默认stdin;sed如果没有指定输出文件,则输出为默认stdout
5.&
&表示追加,例:sed ‘s/tom/&,a good boy’ name.list 在tom后面加上,a good boy
6.g
g是global的意思,以g结尾表示替换能够匹配的每一个,默认sed的s命令只替换匹配的第一个。
注意:特别的,可以以数i结尾表示替换匹配的第i个
例:

	echo tom reads well,tom writes well.>example.txt
	sed 's/tom/bob'<example.txt
	bob reads well,tom writes well.
	sed 's/tom/bob/g'<example.txt
	bob reads well,bob writes well.
	sed 's/tom/bob/2'<example.txt
	tom reads well,bob writes well.

7.注意特殊字符的转义:
\&、\/表示&、/的字面义
8.如果有多个命令,则使用-e
例:sed -e ‘s/tom/bob’ -e ‘s/shadow/sunshine’ file.txt
9.当命令有很多时,可以把命令写在脚本中

$cat fixup.sed
s/foo/bar/g
s/chicken/cow/g
s/draft animal/horse/g
……
$sed -f fixup.sed myfile.xml >myfile2.xml

10.sed会记得在脚本里遇到的最后一个正则表达式——不管它在哪。通过使用空的正则表达式,同一个正则表达式可以再使用。
s/tom/bob/3 替换第3个
s//2 替换第1个
11.sed是如何工作的?
sed一行一行地读取文件,将读到的行放到内存的一个区域————称之为模式空间。
sed按命令改变模式空间的内容,最后输出。
12.-n表示不打印模式空间的内容。p命令则相反。p可以覆盖在-n之上
例:
sed -n ‘s/tom/bob/’ name.list 完成替换后将不会显示
sed -n ‘//p’ index.html 仅显示带有的行
sed -e ‘s/e/E/g’ -e ‘/All/p’ sed-test.txt 对于这条,我发现结果打印出了替换后的文件,但是其中含有All的行连着打印了两次。
写了个文件sed-test.txt。通过上面的第三条指令,肯定两个事实:(1)sed对读入模式空间的一行文本依序执行所有命令选项,然后打印,然后读入另一行。(2)sed的命令选项是针对一行字符的。(这行是(1)的自然推论)例:sed ‘s/tom/bob/4′ 每一行的第4个tom都会被替换,如果不足4个,则不会替换。

13.在脚本中关闭sed的自动打印
通过在首行#n实现
#n
//p
14.正则表达式的一个易错点:
关于*和后向引用
例:
b* 匹配0个或多个b,如null字符、b、bb、bbb
.* 匹配所有字符,如abc、a14f5
[[:alpha:]]* 匹配所有字母,如abc、abdfhsa
\(['"]\).*\1 匹配两个’的出现或是两个”的出现(也就是说如果前面匹配成功的是’,则后面匹配’;反之亦然),如’gjd’、”dsk”只有这两种形式
区别:对于*,如果前置正则是确定的字符,则表示该字符的重现,如果前置正则是一个范围,则表示这个范围内字符的重现;对于后向引用,如果前置正则是一个范围或[]表达式等,则后面的”\数字“表示前面匹配成功的字符的重现,注意成功二字
注意:上面所指的字符可以扩展到表达式,如ERE中的()