设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 综合讨论区 —— LinuxSir.cn
›
shell进阶应用、shell编程
›
指点一下 shell中的 模板替换功能!
1
2
/ 2 页
下一页
返回列表
查看:
1845
|
回复:
13
指点一下 shell中的 模板替换功能!
[复制链接]
since
since
当前离线
积分
28
IP卡
狗仔卡
发表于 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 }'
但是好像不行呀!!!??
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
since
since
当前离线
积分
28
IP卡
狗仔卡
楼主
|
发表于 2003-4-28 13:38:52
|
显示全部楼层
为什么linusir的bbs经常要更新呀,尤其是在晚上!我等“夜猫“可怜呀!
回复
支持
反对
使用道具
举报
显身卡
KornLee
KornLee
当前离线
积分
6960
IP卡
狗仔卡
发表于 2003-4-28 14:41:15
|
显示全部楼层
建议你好好看看sed关于s命令和-e选项的用法,第一个|是多余无用的,;)至于替换,shell中定义的变量好像无法插入到sed中的.
回复
支持
反对
使用道具
举报
显身卡
LYOO
LYOO
当前离线
积分
782
IP卡
狗仔卡
发表于 2003-4-28 19:21:50
|
显示全部楼层
我也来补充一下:
1.如果你要在shell中执行sed,sed只能使用在shell下定义的变量;
2.如果你想在sed中使用脚本中定义的变量,则应该在脚本中调用sed;
3.sed搜索域中的<、>应该使用\转义。
回复
支持
反对
使用道具
举报
显身卡
KornLee
KornLee
当前离线
积分
6960
IP卡
狗仔卡
发表于 2003-4-28 19:26:32
|
显示全部楼层
第2条,是不是需要在shell脚本中调用sed的脚本,那么定义在shell中的变量才起作用呢?
回复
支持
反对
使用道具
举报
显身卡
KornLee
KornLee
当前离线
积分
6960
IP卡
狗仔卡
发表于 2003-4-28 19:35:30
|
显示全部楼层
我又试了试,在脚本中定义的变量,如$a,是无法在sed中使用的!
因此,要解决楼主的问题,只能用文本替换的s和-e选项解决,而不能用变量替换的方式,(我的理解,欢迎讨论)
回复
支持
反对
使用道具
举报
显身卡
LYOO
LYOO
当前离线
积分
782
IP卡
狗仔卡
发表于 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非常相似,不知两者是否有关系。
回复
支持
反对
使用道具
举报
显身卡
KornLee
KornLee
当前离线
积分
6960
IP卡
狗仔卡
发表于 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>
原来是引号在作怪,唉~~~怎么没想到呢?!
回复
支持
反对
使用道具
举报
显身卡
since
since
当前离线
积分
28
IP卡
狗仔卡
楼主
|
发表于 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
为什么???
回复
支持
反对
使用道具
举报
显身卡
LYOO
LYOO
当前离线
积分
782
IP卡
狗仔卡
发表于 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就更简单了
至于第二个问题,我也不太清楚,因为在我这边,你帖中的语句是可以实现连续替换的。
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
/ 2 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
C\C++
计算机认证考试学习与经验交流
Mandriva Linux
红旗 REDFLAG Linux
Debian Linux
RelaxBSD 讨论区
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表