0

我有一个包含此内容的文件

  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 取代了所有的出现。

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

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

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

并且bar可以不同或等于foo

4

5 回答 5

1

As a basis for your solution:

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

output

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

The trick to getting a non-greedy solution, is to say "[^']" (any char not a sngl-quote). Adding the second "[^']*" (and the star), make the whole setting say, "at least 1 char that is not a single-quote". Then you add a single-quote (I use the char-class container to make it more visible, it may not be needed).

When a search target is known, I prefer just to match it, and then type it out again in my replacment string, rather than try to capture the value inside of ()s and reference with \1. again, just that it makes what is happening a little more obvious to a maintenance coder.

I hope this helps

于 2012-04-04T18:31:22.537 回答
0

我在 bash 命令行上针对您的代码 ( ) 的副本运行了这个filename,它奏效了;

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

如果您想影响程序中的所有 sys.path.append() 调用,则有很多转义但很有效。显然,很容易调整以与其他函数/方法调用一起使用。

于 2012-04-04T20:10:36.883 回答
0

我终于用了这个

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

与之前的回车}

是唯一对我有用的东西。

于 2012-04-11T22:30:30.340 回答
0
sed 's@home/user/[^/]*@var/django@' file

是你要找的吗?

它将 /home/user/any_user 替换为 /var/django

于 2012-04-04T17:35:44.410 回答
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
于 2012-04-05T10:54:20.083 回答