存档

‘操作系统’ 分类的存档

[转]:Ubuntu字体美化

2007年10月17日 没有评论

首先要说明的是,我也是一个新人。也是在论坛中看了不少贴子后才会了一些东西。然后将自己的一些心得发上来,希望对大家有所帮助。

首先是将系统装好。在字体中设置原到的10号全部成9号,效果不太理想。

然后按按照论坛中 Vstar达人的

引用:
[分享]我的字体美化方案(Dapper+WQY+MSfont)

http://forum.ubuntu.org.cn/viewtopic.php?t=18638进行。

这里我省略了他的第一个步骤,直接从第二步开始。
因为我不太喜欢文泉驿的字体,还是习惯MS的宋体+Thoma的字体组合,或是再加上Verdana字体。
如果有版权问题,还是请使用文泉驿的字体比较好,使用MS的字体还是会有版权方面的问题。这里只是给看习惯了MS Windows 操作系统界面的朋友提供一个美化方法。

1、安装MS字体
cd /usr/share/fonts
sudo mkdir zh_CN
然后将MS的字体文件(simsun.ttc tahoma.ttf verdana.ttf verdanab.ttf verdanaz.ttf tahomabd.ttf verdanai.ttf)复制到zh_CN目录下,然后

引用:
cd zh_CN
sudo mkfontscale
sudo mkfontdir
sudo fc-cache

注意,有不少朋友反映重启后,出现乱码,所以如果不以是root身份登录到系统进行修改的,而只是用sudo的方式建议再使用下面的命令,修改新增加的字体的权限
sudo chmod 644 /usr/share/fonts/zh_CN/
*

2、修改language-selector.conf文件

引用:
sudo cp /etc/fonts/language-selector.conf /etc/fonts/language-selector.conf_backup
sudo gedit /etc/fonts/language-selector.conf


使用下面的代码替换掉里面的全部内容 ,注意,我这里没有按照Vstar的把文泉驿字体放到第二位,而是直接把宋体(Siumu)放到第二位,因为没有用文泉驿的字体,所以把文泉驿的字体那个 family和string项都删除了。这样一来,如果系统中要使用中文字体,首先用到的就是宋体。

引用:
<fontconfig><alias>

<family>serif</family>

<prefer>

<family>Bitstream Vera Serif</family>
<family>SimSun</family>
<family>DejaVu Serif</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<alias>

<family>sans-serif</family>

<prefer>

<family>Bitstream Vera Sans</family>
<family>Simsun</family>
<family>DejaVu Sans</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<alias>

<family>monospace</family>

<prefer>

<family>Bitstream Vera Sans Mono</family>
<family>Simsun</family>
<family>DejaVu Sans Mono</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<match target=”font” >

<test name=”family” compare=”contains” >
<string>SimSun</string>
<string>Song</string>
<string>Sun</string>
<string>Kai</string>
<string>Ming</string>
</test>
<test name=”weight” compare=”less_eq”>
<int>100</int>
</test>

<test compare=”more_eq” target=”pattern” name=”weight” >

<int>180</int>

</test>

<edit mode=”assign” name=”embolden” >

<bool>true</bool>

</edit>

</match>

<match target=”font” >
<test name=”family” compare=”contains” >
<string>SimSun</string>
<string>宋体</string>
<string>宋体-18030</string>
<string>Song</string>
<string>Sun</string>
<string>Kai</string>
<string>Ming</string>
<string>黑体</string>
<string>新宋体</string>
<string>新宋体-18030</string>
<string>楷体_GB2312</string>
<string>仿宋_GB2312</string>
<string>隶体</string>
<string>SimSun-18030</string>
<string>SimHei</string>
<string>NSimSun</string>
<string>NSimSun-18030</string>
<string>KaiTi_GB2312</string>
<string>FangSong_GB2312</string>
<string>LiSu</string>
</test>

<edit name=”globaladvance”>

<bool>false</bool>

</edit>

<edit name=”spacing”>

<int>0</int>

</edit>

<edit name=”hinting”>

<bool>true</bool>

</edit>

<edit name=”autohint”>

<bool>false</bool>

</edit>

<edit name=”antialias” mode=”assign”>

<bool>true</bool>

</edit>

<test name=”pixelsize” compare=”more_eq”>

<int>12</int>

</test>
<test name=”pixelsize” compare=”less_eq”>

<int>24</int>

</test>
<edit name=”antialias” mode=”assign” >

<bool>false</bool>

</edit>
</match>

</fontconfig>

3、按Ctrl+Alt+Backspace重启X-windows,应该是这样的功能吧。呵呵。
然后再到“系统”“首选项”“字体”中进行设置,注意,设置中还是有一些重要的地方,不然效果还是不太理想。

注意1、在字体选项中
字体全部设置为9号,如果效果和MS Windows的效果不太一样,请全部选择使用THOMA字体,然后全部设置为8号,如下图
<!– –>
注意2、在字体渲染选细节中“平滑”要选“无”,这个很重要,不然英文字体会发虚。
如下图
<!– –>

4、这个是最终效果
<!– –>

另外,如果有兴趣,可以把Firefox中的字体也设置一下,网页的字体也会比较好看。
我设置的如下。
<!– –>
在“高级”中设置如下:
<!– –>

Shell编程学习心得(一)

2007年6月26日 没有评论

最近在和几个同学重温Shell编程。上一次学的时候只学了个皮毛,没怎么深入,这回准备好好的学习一下。这个学习心得不对Shell编程的基础进行详细的讲解,只对我们在学习中遇到的一些问题、解决方法及学习心得做必要的阐述,同时,我也希望能在讨论Shell编程的同时,把它做为一个接口,去学习一些Unix/Linux内部的一些更深入的内容。

这篇文章先发几个我们在讨论中遇到的问题:

1、Linux下的文件和目录都有很严格的权限设定,比如读权限,写权限,执行权限等。这些权限的含义都很容易理解,如果有读权限就可以读该文件,如果有可写权限就可以写该文件,同样,如果有执行权限就可以执行该文件。不过对于执行权限我却有一个问题,那就是,对于目录来说,执行权限的含义是什么?经过实践,发现如果对一个目录没有执行权限,那么就不能使用cd命令切换到该目录,但如果同时有读权限的话,是可以用ls把目录中的内容读取出来的。那么,这种现象说明了什么呢?系统内部对于目录的可执行权限是如何解释的呢?不太明白。同时还注意到,cd是一个shell内部命令,而ls是一个外部命令,不知道这个不同与此现象是否有关。此为问题一。

2、Linux下的文件和目录是通过inode来管理的,它们的权限、存储位置都是存放在inode中的。每个文件系统都有一个专门的inode区域,用于存放inode,每一个inode对应于一个文件或者目录。inode的大小是固定的,其作用相当于指针,指向数据区中的文件内容。当我们讨论硬链接的时候发现一个问题,书上说(《鸟哥的私房菜:基础篇》)目录只消耗inode,而不消耗数据区空间,所以不能用硬链接指向目录,那么问题就来了,目录中的信息是保存在哪的呢?我们知道,目录中记录了inode编号和文件名的对应关系,且目录中可能有很多条这样的记录,对记录的规模好像没有限制,而inode的大小是有限的,如果目录中记录的规模超出的inode的大小,那么多出来的信息保存在哪里呢?目录是怎么做到不消耗数据区的呢?此为问题二。

3、Linux启动时只有一个init进程,其它的进程都是由它或者它的子进程fork出来的,而init进程的所有者是root,而系统中运行的其它进程可以属于其它用户,那么当一个进程进行了fork操作之后,在它的子进程中用exec运行另一个进程,这个新的进程的所有者是否可以改变呢?比如我以用户root的身份运行一个进程,并在这个进程中调用了fork,然后在子进程中运行另一个程序,那么我是否可以把子进程的所有者改为我系统上的另一个用户dzy呢?如果可以,系统内部是如何实现的?

本文只提问题,不做回答(因为还没有回答),希望能与大家探讨。

自己动手写操作系统

2007年6月1日 没有评论

最近在看一本书:《自己动手写操作系统》。虽然看了没多少,但只是此书的前言就已经吸引了我,使我不得不把这本书读完。我很赞同作者对于如何学好计算机科学的看法:边实践、边学习。我也认为人不可能把所有理论都学过之后才能去实践,因为那样的话不但浪费很多的时间,而且一旦实践起来会遇到很多问题,而这些问题是我们从理论的书本上无法学到的。这些困难很有可能让缺少实践的新手望而却步。而边实践边学习就可以随时知道自己欠缺的知识有哪些,学习的方向容易明确,而且在不断的实践中,不断的获得成就感,更有助于进步。

暑假的时候可能会尝试着自己写一个操作系统,虽然对此知道的并不多,但还是要试试,学习为主。不求完美,但求有所收获。

遭遇”门把手事件”

2007年1月5日 没有评论

因为要给我们实验室架设一个论坛,其中用到LDAP做为认证手段,还要结合论坛原有的认证方式,所以这些日子在研究LDAP。这个任务本来没有什么难的,只不过是改一改现成的论坛的认证系统的代码而已,可是后来这个我本以为会很简单的任务变成了一场灾难。

问题的核心在于使用PHP中的LDAP函数库中的函数来写一个谁系统,与论坛本身的认证系统结合起来。这步十分容易,我先研究了一下论坛程序的代码,很快就写出来一个以Mysql为假想外部数据库的解决方案。现在只要用LDAP函数库中的函数来替换这个方案就行了。我查了一下手册,很容易,替换的步骤非常简单。现在,出现一个问题:我没有一个LDAP服务器,从而我也就没有测试的环境。

好了,问题演变成了:配置一个LDAP服务器,为论坛的认证系统提供一个调试环境。

以上的工作我是在Windows下做的。接下来我就开始学习架设LDAP服务器,windows下的LDAP要win2K才能支持,而且也没有独立的服务器程序,所以,我得在LINUX下做这一步。这一步也比较容易,上网找了些文档看了一下,一个LDAP服务器很快就建立好了。但我又发现一个问题:我的LDAP的数据库中没有数据,那我怎么调试呢?转而我又去研究向LDAP中加入数据,从而,我就不可避免的要学习LDIF文件的格式,为了向数据库中插入有意义的测试数据,我不得不学习LDAP中各种objectClass的一些细节。幸好,这些还不是很难,很快的,我搞定了这一步,测试环境建好了。

可是,更令我难受的事情在后面。

接下来,我要在LINUX上装一个论坛,然后测试我的认证系统。可是在安装论坛的时候却怎么也不能成功。而且没有任何提示信息告诉我出了什么问题。后来我不得不把论坛程序中的@字符去掉,结果让我大跌眼镜:我的php不支持mysql函数库!于是,想到了重新编译PHP。可是想一想实在是没必要,不如在window的论坛里直接访问linux下的LDAP,于是这样做了,结果是:我的windows下的PHP不支持LDAP函数库!这一下晕死。转过头来编译PHP,又告诉我GCC不可用,原来是我的虚拟机没有装C函数库,装之,又告诉我没有flex,装之,好歹把PHP编完了,结果无法加载到Apache中!仔细检查了一下,发现我的PHP是Apache1.3版本的模块,而我的Apache是2.0版本!

如果说架设论坛这个任务演变成了配置服务器还请有可原的话,那么这么大费周张的让我把几乎所有的服务器都重新配置一遍是不是有点过分了?

想起来在《面向对象的系统设计》一书中看到的关于”门把手事件”的故事,说的是一个工匠将”如何做一个新的门把手”这个问题变成了”美国的资本主义制度是不是组织政权的最好形式”这个问题。我的经历与这位工匠当然不能比,不过颇有些相似。终于知道了什么叫连锁反应。

不管怎么说,虽然是受尽折磨,但总是学到了不少东西。

分类: 一点心情, 操作系统 标签:

sed一句话技巧

2006年8月24日 没有评论

SED一句话技巧 Mar.23.2001

编:Eric Pement
version 5.1
译:段志岩 @ 吞吴
本文的最新版本通常在:

http://www.student.northpark.edu/pemente/sed/sed1line.txt

http://www.cornerstonemag.com/sed/sed1line.txt

本文的葡萄牙文版本可以在这里找到:

http://www.lrv.ufsc.br/wmaker/sed_ptBR.html

一、文本间距

二倍行距

sed G

在含空行的文件的行与行之间添加空行。输出文件的行与行之间的空行数不会多于一行。

sed '/^$/d; G'

三倍行距

sed 'G; G'

取消二倍行距(假定偶数行为空行)

sed 'n; d'

二、编号方式

标记行号(纯左对齐)。使用tab替代space可以保持页边距。

sed = filename | sed 'N; s/n/t/'

标记行号(号码在左,文本右对齐)。

sed = filename | sed 'N; s/^/ /; s/*(.{6,})n/1 /'

标记行号,但只输出非空的行。

sed '/./=' filename | sed '/./N; s/n/ /'

计算行数(类似于”wc -l”)

SED -N '$='

三、文本转换与替换

UNIX环境下:将DOS换行符转(CR/LF)换成Unix格式

sed 's/.$//' #假定所有行均以CR/LF结尾
sed 's/^M$//' #在bash/tcsh下,按Ctrl-V然后按Ctrl-M
sed 's/x0D$//' #gsed 3.02.80中可用,但第一个脚本更简单一些

UNIX环境下:将UNIX换行符转换成DOS格式

sed "s/$/'echo -e r'/" #ksh命令行模式下
sed 's/$'"/'echo r'/" #bash命令行模式下
sed "s/$/'echo r'/" #zsh命令行模式下
sed 's/$/r/' #gsed 3.02.80

DOS环境下:将Unix换行符(LF)转换成DOS格式

sed "s/$//" #方法一
sed -n p #方法二

DOS环境下:将DOS换行符(CR/LF)转换成Unix格式

#此操作不能在DOS版的sed中实现。转用tr来代替
tr -d r outfile #GNU tr version 1.22或以上

删除行首空白(space, tab),使文本全部左移。

sed 's/^[ t]*//' #请参照文末关于't'的注解

删除行末空白(space, tab)

sed 's/[ t]*$//' #请参照文末关于't'的注解

同时删除行首行尾空白(space, tab)

sed 's/^[ t]*//; s/[ t]*$//'

在每行行首插入5个空格(使页面右移)

sed 's/^/ /'

使文本全部靠右对齐(宽度为79列)

sed -e; a -e 's/^.{1, 78]$/ &amp;/;ta'

使文本居中(宽度为79列)。

#方法一中,行首空格仍然有效,行尾被加上了空白以填补不足。
#方法二中,行首空白在居中过程中被抛弃,行尾也没有补白的空白。
sed -e :a -e 's/^.{1, 77}$/ &amp;/;ta' #方法一
sed -e :a -e 's/^.{1, 77}$/ &amp;/;ta' -e 's/( *)1/1/' #方法二

查找与替换:将每行中的”foo”替换成”bar”

sed 's/foo/bar/' #只替换每行中的第一个实例
sed 's/foo/bar/4′ #只替换每行中的第四个实例
sed 's/foo/bar/g' #替换一行中出现的所有实例
sed 's/(.*)foo(.*foo)/1bar2/' #替换每行倒数第二个实例
sed 's/(.*)foo/1bar/' #只替换替换每行倒数第一个实例

查找与替换:将不含”baz”的行中的”foo”替换成”bar”

sed '/baz/!s/foo/bar/g'

将”scarlet”"ruby”"puce”换为”red”

sed 's/scarlet/red/g; s/ruby/red/g; s/puce/red/g' #适用于大部分sed
gsed 's/scarlet|ruby|puce/red/g' #只适用于GNU的sed

颠倒行序(使末行变首行,首行变末行) (类似tac)

#HHsed的特性(或者是Bug)会导致空行被删除
sed '1!G;h;$!d' #方法一
sed -n '1!G; h; $p' #方法二

反序输出每一行(类似rev)

sed '/n/!G;s/(.)(.*n)/&amp;21/;//D;s/.//' /*这里似乎有点问题*/

如果某行以反斜线结尾,则将下一行接在它的后面

sed -e :a -e '/$/N; s/n//; ta'

如果某行以等号开头, 则将它接在上一行的行尾,并将等号用一个空格来替换

sed -e :a -e '$!N; s/n=/ /; ta' -e 'P;D'

给数值字符串加逗点,如将”1234567″变为”1,234,567″

gsed ':a; s/B[0-9]{3}&gt;/,&amp;/;ta' #GNU sed
sed -e :a -e 's/(.*[0-9]([0-9]{3})/1,2/;ta' #其它sed

给带小数点和负号的数字加逗点(GNU sed)

gsed ':a;s/(^|[^0-9])([0-9]+)([0-9]{3}/12,3/g;ta'

每隔五行加入一个空行

gsed '0~5G' #只适用于GNU sed
sed 'n;n;n;n;G' #其它sed

四、选择输出特定的行

输出文件的前十行(与head类似)

sed 10q

输出文件和第一行

sed q

输出文件和末尾10行(与tail类似)

sed -e :a -e '$q; N;11, $D;ba'

输出文件的最后两行

sed '$!N; $!D'

输出文件的末行

sed '$!d' #方法一
sed -n '$p' #方法二

输出符合正则表达式的行(类似grep)

sed -n '/regexp/p' #方法一
sed '/regexp/!d/ #方法二

输出不符合正则表达式的行(类似grep -v)

sed -n '/regexp/!p' #方法一,其实现与上面的描述是一致的
sed '/regexp/d' #方法二,这样的语法更简单

输出某一正则表达式之前的一行,但不输出含有该正则表达式的行

sed -n '/regexp/{g;1!p;};h'

输出某一正则表达式之后的一行,但不输出含有该正则表达式的行

sed -n'/regexp/{n;p;}'

输出某一正则表达式之前和之后的一行,以及该正则表达式出现的行的行号(与”grep -A1 -B1″)

sed -n -e '/regexp/{=;x;l!p;g;$!N;p;D;}' -e h

提取含AAA和BBB和CCC(任意顺序)的行

sed '/AAA/!d; /BBB/!d; /CCC/!d'

提取含AAA和BBB和CCC(按该顺序)的行

sed '/AAA.*BBB.*CCC/!d'

提取含AAA或BBB或CCC的行(类似于egrep)

sed -e '/AAA/b' -e '/BBB/b' -e'/CCC/b' -e d #适用于大部分sed
gsed '/AAA|BBB|CCC/!d' #只适用于GNU sed

输出含有AAA的段落(空行分隔段落)

#以下脚本在HHsed v1.5 中要在'x;'后加上'G;'
sed -e '/./{H;$!d;}' -e 'x; /AAA/!d;'

输出含AAA和BBB和CCC(任意顺序)的段落

sed -e '/./{H; $!d;}' -e 'x;/AAA/!d; /BBB/!d; /CCC/!d'

输出含AAA或BBB或CCC的段落

sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA|BBB|CCC/b;d' #只适用于GNU sed

输出长度不小于65个字符的行

sed -n '/^.{65}/p'

输出长度小于65个字符的行

sed -n '/^.{65}/!p' #方法一,其实现与上面的描述是一致的
sed '/^.{65}/d' #方法二,这样的语法更简单

输出从给定正则表达式到文件末尾的部分

sed -n '/regexp/,$p'

输出指定行号的部分(如输出8-12行,包括本身)

sed -n '8, 12p'

输出第52行

sed -n '52p' #方法一
sed '52!d' #方法二
sed '52q;d' #方法三(在文件较大时效率更高)

从第三行开始,每七行输出一次

gsed -n '3~7p' #只适用于GNU sed
sed -n '3,${p;n;n;n;n;n;n;} #适用于其它sed

输出两个正则表达式之间的部分(包含本身)

sed -n "/regexp1/,/regexp2/p' #大小写敏感

五、选择性删除特定行

输出除两正则表达式之间部分之外的全部

sed '/regexp1/,/regexp2/d'

删除重复、连续的行(类似uniq)

#一系列重复的行中的第一行将被保留,其余的被删除
sed '$!N; /^(.*)n1$/!P; D'

删除重复、不连续的行

#注意不要造成缓冲区溢出,否则使用GNU sed
sed -n 'G; s/n/&amp;&amp;/; /^([ -~]*n).*n1/d; s/n//; h; P'

删除文件的前十行

sed '1, 10d'

删除文件的末行

sed '$d'

删除文件的最后两行

sed 'N; $!P;$!D;$d'

删除文件的最后10行

sed -e :a -e '$d;N;2,10ba' -e 'P;D' #方法一
sed -n -e :a -e '1, 10!{P;N;D;};N;ba' #方法二

每8行删除一次

gsed '0~8d' #只适用于GNU sed
sed 'n;n;n;n;n;n;n;d;' #适用于其它sed

删除文件中连续的空行(只保留一个空行),包括开头和结尾 (类似cat -s)

sed '/./,/^$/!d' #方法一,文件开头无空行,结尾保留一个空行
sed '/^$/N;/n$/D' #方法二,文件开头允许一个空行,结尾无空行

删除所有连续的空行,除了前两个之外

sed '/^$/N;/n$/N;//D'

删除文首所有的空行

sed '/./,$!d'

删除文末所有空行

sed -e :a -e '/^n*$/{$d;N;ba' -e '}' #适用于所有sed
sed -e :a -e '/^n*$/N;/n$/ba' #同上,但不包括gsed 3.02*

删除每一段落的最后一行

sed -n '/^$/{p;h;};/./{x;/./p;}'

六、特殊用法

去除man文档中的特殊字符(char,backspace)

#如果你使用Unix System V 或者 bash shell,'echo'命令需要一个'-e'参数
sed "s/.`echo b`//g" #Unix 环境下双引号是必需的
sed 's/.^H//g' #在bash/tcsh, 按Ctrl+V 然后按Ctrl+H
sed 's/.x08//g' #sed v1.5的十六进制表达式

获取Usenet/e-mail的头信息

sed '/^$/q' #删除第一个空行后的所有行

获取Subject头信息,但是要删除原始的”Subject:”部分

sed '/^Subject: */!d; s///;q'

获取返回地址头信息

sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

为每一行行首添加一个尖括号和一个空格(引用)

sed 's/^ /&gt; /'

删除行首的尖括号和空格(去除引用)

sed 's/^&gt; //'

去除大部分HTML标签(适用于多行标签)

sed -e :a -e 's/&lt;[^&gt;]*&gt;//g;/

提取多部分的UU编码的二进制文件,删除不必要的头信息,只留下UU编码的部分

#传送给sed的文件必须按适当的顺序
#版本一可以在命令行下输入
#版本二可以写成可执行的Unix脚本
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode #版本一
sed '/^end/,/^begin/d' "$@" | uudecode #版本二

七、典型用法

sed接受一个或多个命令并按顺序对每一行输入执行全部这些命令。当所有的命令都对第一行执行以后,这一行被输出,然后开始对第二行进行处理,如此循环。前面的例子假定输入来自标准输入设备(如控制台,一般是通过管道的输入)。如果输入不来自stdin,可以在命令行中添加一个或多个文件名。输出将被送到标准输出设备。

如:

cat filename | sed '10q' #使用管道输入
sed '10q' filename #同样的效果,不过免去了使用cat
sed '10q' filename &gt; newfile #重定向输出到磁盘

更多语法讲解,包括用包含编辑命令的文件来代替命令行输入,请参阅

  • 《sed&awk,2nd Edition》by Dale Dougherty & Arnold Robbins(O’Reilly, 1997; http://www.ora.com)
  • 《UNIX Text Processing》by Dale Dougherty & Tim O’reilly(Hayden Books, 1987)

或者参考Mike Arst写的教程。

要想发掘出sed的全部力量,你必须懂得”正则表达式”。关于正则表达式,请参阅:

  • 《Mastering Regular Expressions》 by Jeffrey Freidl (O’Reilly, 1997)

Unix系统中的man手册也会有所帮助(试试”man sed”,”man regexp”, 或者看看”man ed”中关于正则表达式的部分),不过man手册是出了名的难懂。它并不是用来教那些sed和正则表达式的初学者的,它是一个写给那些已经掌握了这些工具的人的手册。

八、引号的语法

以上的例子使用单引号而不是双引号来容纳编辑命令,因为sed通常用于Unix平台。单引号可以防止Unix shell对’$”`’这样的字符进行解释和展开,如果它们被包含在双引号中,那么这些就会发生。使用csh或其衍生而来的shell的人,即使是在单引号中,还需要把’!'前加上反斜线才能正确的运行上面的例子。DOS版本的sed总是要求用双引号而不是单引号来包含编辑命令。

九、在sed脚本中使用’t’

为了文档的清晰,我们使用了表达式’t'来代表一个脚本中的制表符。但是多数sed版本不识别’t'这个缩写,因此,在编写这些脚本时你要按TAB键。’t'这个缩写是为awk,perl,HHsed,sedmod,GNU sed v3.02.80的正则表达式所支持的元字符。

十、sed的版本

sed的版本之间确不太一样,可能在语法上有些许的不同。具体说来,很多版本不支持编辑命令中的标签(:name)或分支符(b,t),除了尾部的这些元素。我们使用了可以为大多数sed用户移植的语法,尽管GNU版本的sed允许更简洁的语法。
当读者看到一个相当长的命令像:

sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

知道GNU可以让你把它减缩为:

sed '/AAA/b;/BBB/b;/CCC/b;d' #或者更简单
sed '/AAA|BBB|CCC/b;d'

是很令人高兴的。

另外,记住:很多sed的版本接受这样的命令像”/one/ s/RE1/RE2/”, 有一些不允许”/one/! s/RE1/RE2/”这样在’s'前包含空格的命令。这时,在输入命令的时候要去除空格。

十一、优化速度

当执行速度需要优化(由于输入文件很大或者处理器、CPU较慢)时,如果的替换命令前给出查找命令,替换操作会变得更快。如:

sed 's/foo/bar/g' filename #标准的替换操作
sed '/foo/ s/foo/bar/g' filename #这样执行起来更快
sed '/foo/ s//bar/g' filename #sed速记语法

在进行行的选择和删除操作时,如果你操作的行只是包含在文件前面的一部分时,在脚本中加入一个退出命令’q'会大幅缩减处理大文件的时间。如:

sed -n '45,50p' filename #输出45-50行
sed -n '51q; 45,50p' filename #同样的功能,但执行得更快

Page optimized by WP Minify WordPress Plugin