高等教育出版社 英文:LFS中几个sed语句的作用探讨

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 11:20:51
LFS中几个sed语句的作用探讨



LFS中大部分的命令是很好理解的,但是也出现了部分sed语句,可能不是每个人都很熟悉。
Sed是什么呢?Sed是一种能在几乎所有UNIX平台(包括Linux)运行的轻量级流编辑器,也可以说是
一个非交互式的字处理器。Sed最大的长处在于可以使编辑文件的过程自动化,因此很适合运用在脚本中,
通过脚本程序在非交互的状态下自动地编辑处理文本。
在Linux系统中,文本处理的软件是相当丰富的。awk和sed的作用差不多,但语法差别较大。Grep,Perl
也有很大一部分功能与sed基本相同。作为学习者,一般最好能精通其中之一。

下面是我对LFS中的一些sed语句的作用的探讨,其中错误和不明白之处在所难免,希望方家指出。
大家共同学习提高。


5.7. Adjusting the Toolchain
sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
这是一个sed语句的最常用的用法:查找替换,不过使用了@作为分割符号---一般人
更多地使用/作为分割符号,这里为了不与后面的路径符号混淆使用@,第一个s代表
查找替换,最后那个g代表全局替换,否则就只替换每行的第一个。

整个语句的作用的是:在文件$SPECFILE中查找"/lib/ld-linux.so.2",找到就用"/tools/lib/ld-linux.so.2"
替换,并把替换后的结果写入到文件temspecfile中---因为sed不会修改源文件。注意紧接这个命令后面使用
了一个mv命令使新生成的tempspecfile代替了原来的$SPECFILE。

这句命令显然是调整工具链中重要的一个环节,它修改了gcc的spec文件以使用新的动态连接库。

5.31. Util-linux-2.12q
sed -i 's@/usr/include@/tools/include@g' configure
参数-i的意思是直接在后面的文件上进行编辑。
这句的作用是编辑configure文件,把里面的"/usr/include"全部替换为"/tools/include",也就是使用初步调整
后的工具链中的头文件而不是原来宿主系统的头文件。
但为什么要这样做不太明白,好象其他软件没有要求这样。

6.15. Coreutils-5.2.1
sed -i '/dummy/d' /etc/passwd /etc/group
这个sed语句的作用是从配置文件/etc/passwd和/etc/group中删除含有dummy的行,这个dummy是前面为了
测试而添加的临时用户及组。
不删除应该也没有什么吧?

6.28. Sed-4.1.4
sed -i 's@/doc@&/sed-4.1.4@' doc/Makefile.in
这个语句的作用是编辑doc/Makefile.in文件,把其中所有的"/doc"替换为"/doc/sed-4.1.4",注意这里使用
了一个&字符代表所查找到的字符串。
因为缺省情况下,sed安装自己的doc文件到目录下/usr/share/doc下,通过这个语句使doc文件安装到
/usr/share/doc/sed-4.1.4下面,没有这个sed语句应该不影响系统的继续编译,只不过目录有些乱了套。

6.32. IPRoute2-2.6.11-050330
sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
这个语句与前面的sed语句的不同之处在于:在s命令前面多了'^TARGET',它限定了s命令的作用范围。
整个语句的作用是:在misc/Makefile中,找到以"TARGET"开头的行,在这个行中把"arpd“去掉(也就
是用空字符替换)。
这样做的原因是:要编译出arpd的二进制目标程序,需要依赖Berkley DB这个软件,而LFS直到这一步
并没有安装这个软件----BLFS中倒是有----所以干脆不要。

6.37. Bash-3.0
sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/bash-3.0|" \
Makefile.in
这个sed语句是当下载并解压了bash-doc-3.0.tar.gz文件才需要的。
语句的作用是把Makefile.in文件中的"htmldir=@htmldir@"替换为"htmldir=/usr/share/doc/bash-3.0",
作者这里又使用了"|"作为sed语句的分隔符号。
但是我不太明白Makefile.in文件中的"@htmldir@"到底指向哪个目录,在哪里定义的?

6.43. E2fsprogs-1.37
sed -i -e 's/-DTEST/$(ALL_CFLAGS) &/' lib/e2p/Makefile.in
作者只是说这样可以修正一个bug,是什么bug以及为什么要这样修改,作者都没有说明。

6.46. Gzip-1.3.5
sed -i 's@"BINDIR"@/bin@g' gzexe.in
这个语句的作用是修改gzexe.in文件,把其中所有的"BINDIR"字符串用"/bin"来替换。
这样修改是因为gzexe脚本里包含对gzip程序的硬路径引用,后面要改变gzip程序的位置到/bin目录下,
所以用这个sed命令改变脚本中的硬路径。
但是为什么一定要把gzip放在/bin下而不是/usr/bin下呢?不太清楚。

6.48. Man-1.5p
sed -i 's@-is@&R@g' configure
sed -i 's@MANPATH./usr/man@#&@g' src/man.conf.in
第一个语句的作用是修改文件configure,找到字符串"-is"并在后面加一个R字母。这样做的原因是:
在PAGER变量中加了-R参数,以正确的处理Less的转义序列。
第二个语句的作用是修改文件src/man.conf.in,在其中找到有"MANPATH./usr/man"的行,并把这行注
释掉----即在前面加一个#。这样做可以避免运行像whatis这样的命令时产生多余的结果。


6.54. Shadow-4.0.9
sed -i 's/groups$(EXEEXT) //' src/Makefile
sed -i '/groups/d' man/Makefile
前面一个sed语句是把src/Makefile文件中的字符串"group$(EXEEXT)"去掉,后面一个sed语句则是把把
man/Makefile文件中含字符串"groups"的行去掉。
这样就不再安装groups程序及其相关手册,因为LFS安装的另外一个软件Coreutils中有一个更好group程序。

sed -e's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
-e 's@/var/spool/mail@/@' \
etc/login.defs.linux > /etc/login.defs
这是一个由两部分构成的sed语句,前面的意思是在文件etc/login.defs.linux中找到字符串"#MD5_CRYPT_ENAB.no",
改为"MD5_CRYPT_ENAB yes",这样可以在缺省的情况下,使用安全级别更高的MD5方式来进行加密。
后面的部分意思是:把文件中的字符串"/var/spool/mail"改为"/var/mail"。这是因为shadow以前使用/var/spool/mail
作为邮箱而现在一般使用/var/mail。

修改的结果写入为/etc/login.defs。


6.56. Sysvinit-2.86
sed -i 's@Sending processes@& started by init@g' \
src/init.c
这个sed语句修改src/init.c源文件,把其中的"Sending processes"修改为"Sending processes started by init"。
这是因为当运行级别被改变(比如,正在关闭系统),init将向那些由init启动的,并且将不会在新的运行级别里运行
的线程发送终止信号。当init做上面这些事情时,会输出像"Sending processes the TERM signal"这样的信息,这看起
来就像它正在向那些系统正在运行的程序发送上面这些信息一样。要避免错误地理解这个信息,修改源码以便可以代
替为读起来像"Sending processes started by init the TERM signal"的信息。

6.59. Util-linux-2.12q
sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
hwclock/hwclock.c
这个sed语句的作用是:修改文件hwclock/hwclock.c,把其中的"etc/adjtime"全部替换为"var/lib/hwclock/adjtime"。
这样做是为了符合FHS规范,因为FHS推荐使用/var/lib/hwclock目录代替常用的/etc目录来存放adjtime文件。