LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1690|回复: 13

指点一下 shell中的 模板替换功能!

[复制链接]
发表于 2003-4-28 13:35:44 | 显示全部楼层 |阅读模式
本人最近在学习shell编程!
遇到一个问题,请高人指教!

我想实现一个用模板文件中域的替换功能:
讲不太清楚,看下面的例子:
templete.txt
------------------------------
Hello,<!--name-->!
where are you going?
I want to <!--where-->
------------------------------
以上是要使用的模板,其中有两个域:<!--name--> <!--where-->

我有两个变量: $NAME $WHERE
通过sed 怎么 把这两变量提换到上面的域中,并且输出到标准输出中去?

我是这样写的:
sed s/<!--name-->/${NAME}/g templete.txt | sed s/<!--where-->/${WHERE}/g | awk '{ print $0 }'
但是好像不行呀!!!??
 楼主| 发表于 2003-4-28 13:38:52 | 显示全部楼层
为什么linusir的bbs经常要更新呀,尤其是在晚上!我等“夜猫“可怜呀!
发表于 2003-4-28 14:41:15 | 显示全部楼层
建议你好好看看sed关于s命令和-e选项的用法,第一个|是多余无用的,;)至于替换,shell中定义的变量好像无法插入到sed中的.
发表于 2003-4-28 19:21:50 | 显示全部楼层
我也来补充一下:
1.如果你要在shell中执行sed,sed只能使用在shell下定义的变量;
2.如果你想在sed中使用脚本中定义的变量,则应该在脚本中调用sed;
3.sed搜索域中的<、>应该使用\转义。
发表于 2003-4-28 19:26:32 | 显示全部楼层
第2条,是不是需要在shell脚本中调用sed的脚本,那么定义在shell中的变量才起作用呢?
发表于 2003-4-28 19:35:30 | 显示全部楼层
我又试了试,在脚本中定义的变量,如$a,是无法在sed中使用的!
因此,要解决楼主的问题,只能用文本替换的s和-e选项解决,而不能用变量替换的方式,(我的理解,欢迎讨论)
发表于 2003-4-28 19:38:35 | 显示全部楼层
呵呵,我在系统上实验结果正好与你相反,是可以引用的。

创建text.txt文件,内容如下:
who:<!--who-->
where:<!--where-->
Hello World !

创建seduse.sh,内容如下:
#!/bin/bash
who=me
where=china
sed -e s/\<!--who--\>/$who/g text.txt -e s/\<!--where--\>/$where/g

执行情况:
lyoo@lsd:~/shellsample$ ./seduse.sh
who:me
where:china
Hello World !
lyoo@lsd:~/shellsample$


另外sed替换域的变量可以直接引用,似乎没必要${NAME}。我学vim了解一些ex的知识,感觉它与sed非常相似,不知两者是否有关系。
发表于 2003-4-28 21:15:00 | 显示全部楼层
谢谢~~,我终于明白问题处在哪里啦!原来跟我用的sed命令的引号有关系!谢谢LY00兄指点!;)
javalee//home/javalee>a=lee
javalee//home/javalee>cat abc
sdfaskdfjjklas
abcd
jjj
javalee//home/javalee>sed 's/jjj/$a/' abc
sdfaskdfjjklas
abcd
$a
javalee//home/javalee>sed s/jjj/$a/ abc
sdfaskdfjjklas
abcd
lee
javalee//home/javalee>
原来是引号在作怪,唉~~~怎么没想到呢?!
 楼主| 发表于 2003-4-29 13:42:59 | 显示全部楼层
ly00兄的方法好像不行呀
会提示:
-bash: !--name--\ : event not found

我是用这种方法的:
sed -e s/'<!--name-->'/${name}/g text.txt

但是要连续替换多个就不行了!
sed -e s/'<!--name-->'/${name}/g text.txt -e s/'<!--where-->'/${where}/g

为什么???
发表于 2003-4-29 14:17:52 | 显示全部楼层
-bash: !--name--\ : event not found
可能应该是因为没对!转义造成的,!是bash的关键字。
sed -e s/\<\!--who--\>/$who/g text.txt -e s/\<\!--where--\>/$where/g应该就行了。
不过sed -e s/'<!--name-->'/${name}/g text.txt就更简单了

至于第二个问题,我也不太清楚,因为在我这边,你帖中的语句是可以实现连续替换的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表