Chinaunix

标题: 文本替换问题,请指点。 [打印本页]

作者: jianjun    时间: 2003-06-16 17:18
标题: 文本替换问题,请指点。
我依照上面的内容,编辑了下面的纯文本文件:

for i in ./* ; do
echo "Testing" grep "abc" $i
if [ "$i" != "./replace" -a $? -ne 1 ]
then
echo "Replacing" $i
sed "s/abc/xyz/g" $i > $i.new
fi
done

保存为replae,然后
#sh replace

屏幕显示:

Testing grep abc ./admin.php
replace: line 3: [./admin.php: No such file or directory
.......
.......
.......

replace和admin.php在同一目录,这怎么解决?

我第一次用Shell 脚本。

谢谢。
作者: admirer    时间: 2003-06-16 17:32
标题: 文本替换问题,请指点。
直接使用*匹配文件名,不要用“./”
作者: admirer    时间: 2003-06-16 17:32
标题: 文本替换问题,请指点。
直接使用*匹配文件名,不要用“./*”
作者: admirer    时间: 2003-06-16 17:36
标题: 文本替换问题,请指点。
直接使用*匹配文件名,不要用“./*”   

啊!
这是怎么了 ?以下子发这么多?

麻烦版主给删除吧!
作者: jianjun    时间: 2003-06-16 21:50
标题: 文本替换问题,请指点。
我改了,结果变成了:

Testing grep abc admin.php
replace: line 3: [replace: command not found

......
......
......

这可怎么办呢?
作者: admirer    时间: 2003-06-16 21:59
标题: 文本替换问题,请指点。
把replace放在别的目录下,脚本就可以简化了:
for i in * ; do
echo "Testing" grep "abc" $i
if [ $? -eq 0 ]
then
echo "Replacing" $i
sed "s/abc/xyz/g" $i > $i.new
fi
done
作者: bjgirl    时间: 2003-06-16 22:10
标题: 文本替换问题,请指点。
如果需要使用通配符,用[[和]]作检测是可以的,因为[]不支持通配符扩展.
作者: jianjun    时间: 2003-06-17 09:09
标题: 文本替换问题,请指点。
我按照圣骑士admirer的建议修改了脚本文件,把他放到了/bin目录下,并赋予了执行权,然后在要修改的目录中删除原来的脚本文件,进行如下操作:

#replace

屏幕显示如下:

Testing grep abc admin.php
/bin/replace: line 3: [0: command not found

......
......
......

怎么办?
作者: admirer    时间: 2003-06-17 09:11
标题: 文本替换问题,请指点。
这样试试
if [ "$?" -eq 0 ]
作者: jianjun    时间: 2003-06-17 09:22
标题: 文本替换问题,请指点。
admirer,

if [ "$?" -eq 0 ] 试过了,还是不行。

同样的结果:

Testing grep abc admin.php
/bin/replace: line 3: [0: command not found

......
......
......


怎么办?
作者: admirer    时间: 2003-06-17 10:01
标题: 文本替换问题,请指点。
你的OS,我在SCO UNIX sh ksh下试验都没有问题呀!
作者: jianjun    时间: 2003-06-18 09:51
标题: 文本替换问题,请指点。
问题还是没有解决。我的操作系统是Redhat 8.0,我的步骤如下:
1。用gedit编辑纯文本文件replace.
2。保存到/bin目录下。
3。赋予replace文件执行权。
4。回到目标目录,执行命令:
    #sh replace

然后就看到以前我说的结果。

问题虽然还没有解决,但环视要感谢你的热情帮助
作者: admirer    时间: 2003-06-18 11:48
标题: 文本替换问题,请指点。
既然有执行权了,就直接用replace执行吧!
或者改一下判断语句的形式再试试:
if [ "A$?"  =  "A0"  ]
作者: jianjun    时间: 2003-06-19 09:57
标题: 文本替换问题,请指点。
结果变成了:

Testing grep abc admin.php
/bin/replace: line 3: [A0: command not found

......
......
......
作者: admirer    时间: 2003-06-19 10:08
标题: 文本替换问题,请指点。
在SCO UNIX下没有问题的呀!
没用过Redhat 8.0,差别这么大?
作者: 凝嫣    时间: 2003-06-19 10:22
标题: 文本替换问题,请指点。
我想问题是不是出在写的规范上面,看他提示都是第三句的判断出错。
if 语句的"[ ]" 前后有空格的
作者: jianjun    时间: 2003-06-19 16:19
标题: 文本替换问题,请指点。
if语句"[]"前后都有空格,还是不行,同样的结果。

谁有没有更成熟的文本替换方案
作者: admirer    时间: 2003-06-19 16:57
标题: 文本替换问题,请指点。
http://chinaunix.net/forum/viewtopic.php?p=402697&highlight=muzx#402697
作者: 红袖添香    时间: 2003-06-19 19:21
标题: 文本替换问题,请指点。
[quote]原帖由 "jianjun"]if语句"[]"前后都有空格,还是不行,同样的结果。[/quote 发表:
   

我有99.99%的把握是你的格式写错,而且就是没有空格!不是 if 前后,也不是 [] 之前后,问题是出在 ["A$?" = "A0"]上,不然,这句

if [ "A$?" = "A0" ]

不会变成

/bin/replace: line 3: [A0: command not found   

[A 都挨一块儿了!

另外,象 $? 这样的判断,一般是用数值,也就是用 -eq 来判断,也无需引号和附加字符,因为 $? 肯定是个数字,不会为空。

所以■if■[■$?■-eq■0■]■就行了

所有的 ■ 都表示一个或多个空格。
作者: jianjun    时间: 2003-06-20 07:26
标题: 文本替换问题,请指点。
我依照法师红袖添香的建议该了一下,通过了,结果如下:

Testing grep abc admin.php
Replacing admin.php
......
......
......



谢谢大家
作者: anonimousboy    时间: 2003-06-20 08:48
标题: 文本替换问题,请指点。
原帖由 "红袖添香"]q■0■ 发表:
■就行了

所有的 ■ 都表示一个或多个空格。
   
俺第一次写SHELL犯的也是这个错误,不过是我一点一点摸索出来的,我记得我还发过一次关于写判断语句的贴,最后红袖回答有两个写法正确~~~
作者: jianjun    时间: 2003-06-27 16:14
标题: 文本替换问题,请指点。
我想有上面的办法替换一个目录及其子目录下的所有文件中的字符串,但结果如下:

Testing grep abc admin
Replacing admin
  (闪烁光标)

然后就不动了。

有什么办法实现递归目录下的文本替换吗?
作者: admirer    时间: 2003-06-27 21:28
标题: 文本替换问题,请指点。
把你的代码贴出来看看!
作者: 红袖添香    时间: 2003-06-28 00:27
标题: 文本替换问题,请指点。
原帖由 "jianjun" 发表:
光标)

然后就不动了。

有什么办法实现递归目录下的文本替换吗?
   

可能是你的脚本中出现了文件名为空串,
所以程序在等待从标准输入设备读入数据。
作者: admirer    时间: 2003-06-28 11:12
标题: 文本替换问题,请指点。
是啊,给几个回车看看有什么反应!
作者: it007    时间: 2003-06-29 17:30
标题: 文本替换问题,请指点。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2