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がすべての発生を取り戻すため、問題が発生しました。

編集: 明確にするために、一重引用符内の値のみを置き換えたいと思います。すなわち:

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

ソリューションの基礎として:

 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ではない任意の文字)と言うことです。2番目の「[^']*」(および星)を追加して、設定全体に「一重引用符ではない少なくとも1文字」と表示させます。次に、一重引用符を追加します(charクラスのコンテナーを使用して見やすくしますが、必要ない場合もあります)。

検索対象がわかっている場合は、()内の値を取得して、\ 1で参照するのではなく、一致させてから、置換文字列にもう一度入力することをお勧めします。繰り返しになりますが、それだけで、何が起こっているのかがメンテナンスコーダーにとってもう少し明白になります。

これがお役に立てば幸いです

于 2012-04-04T18:31:22.537 に答える
0
sed 's@home/user/[^/]*@var/django@' file

それはあなたが探しているものですか?

/ home / user/any_userを/var/djangoに置き換えます

于 2012-04-04T17:35:44.410 に答える
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

任意のプログラムに対して実行できる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 に答える
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 に答える