我有一个包含此内容的文件
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 :(得分:1)
作为解决方案的基础:
replStr="/var/django"
echo "sys.path.append('/home/user/dj/project/')" \
| sed "s@sys.path.append('[^'][^']*[']@sys.path.append('${replStr}'@"
<强>输出强>
sys.path.append('/var/django')
获得非贪婪解决方案的诀窍是说“[^']”(任何字符不是sngl-quote)。 添加第二个“[^'] *”(和星号),使整个设置说“至少1个不是单引号的字符”。然后你添加一个单引号(我使用char-class容器使它更明显,可能不需要)。
当搜索目标已知时,我更喜欢匹配它,然后在我的替换字符串中再次键入它,而不是尝试捕获()s中的值并使用\ 1引用。再次,只是它使维护编码器发生的事情变得更加明显。
我希望这会有所帮助
答案 1 :(得分:0)
sed 's@home/user/[^/]*@var/django@' file
这是你在找什么?
它会将/ home / user / any_user替换为/ var / django
答案 2 :(得分:0)
我在bash命令行上针对您的代码的抄送副本(filename
)运行此操作并且它有效;
sed s/sys\.path\.append\(\'.*\'\)/sys\.path\.append\(\'\\/var\\/django\\/proj\\/\'\)/ filename
如果您想要影响程序中的所有sys.path.append()调用,那么有很多转义但是可以解决这个问题。显然,调整其他函数/方法调用很容易。
答案 3 :(得分: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 "s@\\($fun\\)(\'.*\')@\\1\(\'$text\'\)@" $1
}
main $*
实施例
replacer.bash sys.path.append /var/django/proj/ myprog > myprog.new
答案 4 :(得分:0)
我终于使用了这个
sed -i "1,/sys.path.append/ {/sys.path.append/i sys.path.append('$HOMEDIR/')\nsys.path.append('/home/$SYS_USER/')
}" $HOMEDIR/wsgi.py
在}
是唯一对我有用的东西。