LinuxSir.cn,穿越时空的Linuxsir!

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

sed替换功能中变量如何表示?

[复制链接]
发表于 2003-6-11 19:00:37 | 显示全部楼层 |阅读模式
脚本如下:
#!/bin/bash

IP1=`cat /tmp/ip1`
IP2=`cat /tmp/ip2`

sed -e 's/$IP1/$IP2/g' /tmp/test.txt

此脚本未把/tmp/test.txt文件中的包含/tmp/ip1的内容字符替换为/tmp/ip2中的字符

请教了!!!

zzj
发表于 2003-6-11 19:10:22 | 显示全部楼层

sed -e 's/$IP1/$IP2/g' /tmp/test.txt
改成
sed -e s/${IP1}/${IP2}/g /tmp/test.txt
试试
http://www.linuxsir.cn/bbs/showt ... 15&pagenumber=1
技巧区里有示例;)
 楼主| 发表于 2003-6-11 20:35:20 | 显示全部楼层
可以了,非常感谢!
发表于 2003-6-11 22:41:46 | 显示全部楼层
俺没试成功;(

#!/bin/bash
old=`cat old`
new=`cat new`
sed -e s/${old}/${new}/ test.htm

运行结果是:sed: -e expression #1, char 55: Unterminated `s' command

必须使用'将s/x/y/g括起来,这样一来$就给屏蔽了。请教了
发表于 2003-6-11 23:16:31 | 显示全部楼层
其实这就是一个sed如何接受shell传递过来的变量的问题,举例说明吧~~
[javalee//home/javalee/myshell]cat tmp;catfilename;filename
abckkjkjkjkjkjkjklee
djkdjkdfj
lee
#!/bin/bash
old=lee
new=abc
sed s/${old}/${new}/g tmp
abckkjkjkjkjkjkjkabc
djkdjkdfj
abc
在这种情况下,sed中的要进行替换的变量是不能用引号的!请恕小弟愚昧,有些道理我表达得不恰当,;)还望LY兄补充;)
发表于 2003-6-11 23:50:32 | 显示全部楼层
javalee兄说的都不错,我也觉得你的脚本是正确的,但你的脚本
#!/bin/bash
old=lee
new=abc
sed s/${old}/${new}/g tmp
在俺的机器上运行出错:sed: -e expression #1, char 55: Unterminated `s' command
出错原因我百思不得其解
发表于 2003-6-11 23:55:23 | 显示全部楼层
OS:RH8
kernelinux 2.4.18-14
sed:GNU sed version 3.02
bash:GNU bash, version 2.05b.0(1)-release (i686-pc-linux-gnu)
发表于 2003-6-12 00:07:27 | 显示全部楼层
Woody
Linux lsd 2.4.18-bf2.4
GNU sed version 3.02
GNU bash, version 2.05a.0(1)-release (i386-pc-linux-gnu)
发表于 2003-6-13 09:51:45 | 显示全部楼层
try
sed -e  's/'$old'/'$new'/g' tmp
发表于 2003-6-14 10:23:07 | 显示全部楼层
呵呵,终于找到问题所在了:文件old只能是单行,也就是说sed中s/$old/$new/g只能处理单行匹配,如果cat old处理的old文件包含多行,脚本就要出错了。
这个问题是解决了,但新问题也来了,通常单行匹配替换是不够的,最近我在处理一个html文档时,遇到一个问题:需要将文档中的某个段落的替换成别一个段落。例如:

样例文件:
新新新木质部
老段落老段落
一个多行的
老段落
老段落

%工吸早可右
老袁查
是困下中有国人

老段落老段落
一个多行的
老段落
老段落


老段落老段落

一个多行的
老段落
老段落

现要将
老段落老段落
一个多行的
老段落
老段落
(即:样例文件中红色部分)

替换成:
新段落新
一个多行的新段落
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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