Chinaunix

标题: 请教: "perl -pi -e"在sh, csh中的问题 [打印本页]

作者: thyswallow    时间: 2011-01-05 23:25
标题: 请教: "perl -pi -e"在sh, csh中的问题
本帖最后由 thyswallow 于 2011-01-05 23:26 编辑

想用"perl -pi -e"使用正则表达式匹配并替换文件中的特殊字符,在 sh中工作正常,但是在 csh中,虽然替换成功,但是总是出现一些额外的信息。


Eg, 替换临时文件中的password, 将12345 替换成 xxxx.

1.tmpfile
============================================
isql -Upxedbo -P12345 -SLON_PXE_UAT -DPXE -iCMG22546.sql
============================================

替换后的文件应为:isql -Upxedbo -Pxxxx -SLON_PXE_UAT -DPXE -iCMG22546.sql


2. Script
============================================
#!/bin/csh

grep -i "isql" tmpfile > /dev/null
if ( $status == 0 ) then
        echo "matched"
        `perl -pi -e "s/(.*) -P(.*) (.*)/\1 -Pxxxx \3/" tmpfile`
else
        echo "don't match"
endif
============================================

3. Run
>./testfile2
matched
/usr/openwin/bin/: Permission denied
>


4. Problem
运行后, tmpfile文件中的12345被正确替换成了xxxx, 但是出现
/usr/openwin/bin/: Permission denied。

如果使用#!/bin/sh,就不会出现这样的信息。
而且在不同的机器上运行,有时会出现不同的信息。
/usr/local/bin/: Permission denied

觉得很蹊跷,请指点。
作者: jason680    时间: 2011-01-05 23:58
想用"perl -pi -e"使用正则表达式匹配并替换文件中的特殊字符,在 sh中工作正常,但是在 csh中,虽然替换成 ...
thyswallow 发表于 2011-01-05 23:25



`perl -pi -e "s/(.*) -P(.*) (.*)/\1 -Pxxxx \3/" tmpfile`

改成
`perl -pi -e 's/\-P(\S+)/-Pxxxx/' tmpfile`
作者: thyswallow    时间: 2011-01-06 04:45
回复 2# jason680


    谢谢jason680。
   还是有同样的信息。

   >./testfile2
       matched
      /usr/openwin/bin/: Permission denied
作者: 99超人    时间: 2011-01-06 08:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: ly5066113    时间: 2011-01-06 08:36
echo $PATH
看看,是不是里面有 /usr/openwin/bin/ 这个路径,有的话去掉应该就可以了。
作者: jason680    时间: 2011-01-06 11:30
回复  jason680


    谢谢jason680。
   还是有同样的信息。

   >./testfile2
       matched
  ...
thyswallow 发表于 2011-01-06 04:45



isql 最好加绝对路径
ex: /usr/bin/isql
用which isql就知道在那....
作者: thyswallow    时间: 2011-01-06 22:39
回复 5# ly5066113


   请问为什么要去掉呢?
   我在另外一台机器上运行时: 出现信息
  
  /usr/local/bin/: Permission denied

   不能把所有出现信息的PATH都去掉吧?
  
  而且,#!/bin/sh就没有任何问题。
作者: thyswallow    时间: 2011-01-06 22:47
回复 6# jason680


    如果isql是放在tmpfile中需要的执行的话,是需要绝对路径的。
   但是,我只是将tmpfile文件当作文本文件将password进行替换,绝对路径是没有必要的吧?
   
   即便试了在tmpfile文件中删除isql,不做 “grep”判断就对password进行替换,还是会出现
   /usr/local/bin/: Permission denied
作者: jason680    时间: 2011-01-06 22:51
本帖最后由 jason680 于 2011-01-06 22:53 编辑
回复  jason680


    如果isql是放在tmpfile中需要的执行的话,是需要绝对路径的。
   但是,我只是将 ...
thyswallow 发表于 2011-01-06 22:47



沒有人說是perl的問題....

為什麼不用set -x看一下,就知道問題在那!!??....
作者: thyswallow    时间: 2011-01-06 23:54
回复 9# jason680


    谢谢你的回复!

   我已经将script改为两行。如果#!/bin/csh就会出现多余的信息,如果#!/bin/sh 或者 #!/bin/bash就没有问题。

    请问我如何用set -x进行调试?还请详示,不吝指教。 多谢!

   
    #!/bin/csh
     `perl -pi -e "s/(.*) -P(.*) (.*)/\1 -Pxxxx \3/" tmpfile`
作者: ly5066113    时间: 2011-01-07 08:36
回复 7# thyswallow


那就把你脚本里的命令都改成绝对路径。
perl --> /usr/bin/perl
grep --> /usr/bin/grep
......
作者: jason680    时间: 2011-01-07 09:05
回复  jason680


    谢谢你的回复!

   我已经将script改为两行。如果#!/bin/csh就会出现多余的信 ...
thyswallow 发表于 2011-01-06 23:54



>> 我已经将script改为两行。如果#!/bin/csh就会出现多余的信 ...

在那!!?? 不贴上来......no one can help you!!!

为什么一定要加 `perl ..... `(反引号)
直接perl ...... 不行吗!!?? (之前"99超人"回复,已经说了....)




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