2012-04-04 22 views
0

几次不同的字符串替换相同的字符串在文件中我有一个文件与此内容使用bash

import os 
    import sys 

    sys.path.append('/home/user/dj/project/') 
    sys.path.append('/home/user/dj/') 

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj.settings") 

    import django.core.handlers.wsgi 
    application = django.core.handlers.wsgi.WSGIHandler() 

/home/user/dj/proj//home/user/dj/可能是其他未知值。

我有一个bash脚本做安装,并在那里我想执行的东西这些线路改变这种

import os 
    import sys 

    sys.path.append('/var/django/proj/') 
    sys.path.append('/var/django/') 

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj.settings") 

    import django.core.handlers.wsgi 
    application = django.core.handlers.wsgi.WSGIHandler() 

我试着用sed但我不得不用正则表达式的贪婪烦恼。

我试过perl -pi -e s/str1/str2/但我遇到了麻烦,因为perl重新发生了所有的事情。

编辑: 为了澄清,我想只替换单引号内的值。即:

sys.path.append('foo')sys.path.append('what I want')

sys.path.append('bar')sys.path.append('the second thing I want')

bar可能是不同或相同foo

+0

你能澄清你的意思是“其他,未知的价值”?你想用'/ var/django'替换所有'/ home/user/XXX'目录吗?还是比这更复杂? – 2012-04-04 17:29:00

+1

我不确定正则表达式是否是正确的工具。你有没有想过只使用某种配置文件?在安装过程中将所需的dir名称放在配置文件中,然后将它们读入'sys.path.append('/ path/from/config /')' – alan 2012-04-04 17:34:33

+0

@ F.J:我编辑了问题以阐明此问题。分隔符是单引号。 – jperelli 2012-04-04 17:46:41

回答

0

我终于与前}

是回车使用该

sed -i "1,/sys.path.append/ {/sys.path.append/i sys.path.append('$HOMEDIR/')\nsys.path.append('/home/$SYS_USER/') 
}" $HOMEDIR/wsgi.py 

仅仅是为我工作的事情。

0
sed '[email protected]/user/[^/]*@var/[email protected]' file 

是你在找什么?

它将替换/ home/user中/ ANY_USER到/ var/Django的

+0

/家庭/用户可能是其他价值,我编辑了这个问题来澄清这一点。分隔符是单引号。 – jperelli 2012-04-04 17:45:48

1

至于你的解决方案的基础:

replStr="/var/django" 
echo "sys.path.append('/home/user/dj/project/')" \ 
| sed "[email protected]('[^'][^']*[']@sys.path.append('${replStr}'@" 

输出

sys.path.append('/var/django') 

的窍门能让一个非贪婪的解决方案是说“[^']”(任何char不是sngl引用)。 添加第二个“[^'] *”(和星号),使整个设置表示“至少有一个字符不是单引号”。然后你添加一个单引号(我使用char-class容器使其更加可见,可能不需要)。

当搜索目标已知时,我宁愿只匹配它,然后在替换字符串中再次输入它,而不是尝试捕获()s中的值并引用\ 1。再一次,只是它使维护编码器的情况更加明显。

我希望这有助于

0

我跑这对你的代码(filename)的翻版bash命令行上,它的工作是一种享受

sed s/sys\.path\.append\(\'.*\'\)/sys\.path\.append\(\'\\/var\\/django\\/proj\\/\'\)/ filename 

有很多逃离的,但工作,如果你想影响所有sys.path.append()请客调用你的程序。显然,调整其他函数/方法调用很容易。

0

如果你想要一个bash脚本,你可以运行任何程序来改变传递给任何给定函数的字符串,那么你可以使用这个;

#!/bin/bash 

# Usage: replacer.bash funcname repstring inputfile 
#   funcname - function/method to affect 
#   repstring - replacement string that you want passed into the function/method 
#   inputfile - program/script to process 

function main 
{ 
    fun=$1 
    shift 
    text=$1 
    shift 

    sed "[email protected]\\($fun\\)(\'.*\')@\\1\(\'$text\'\)@" $1 
} 

main $* 

示例;

replacer.bash sys.path.append /var/django/proj/ myprog > myprog.new