使用bash在文件中使用不同的字符串多次替换相同的字符串

时间:2012-04-04 17:23:09

标签: python regex perl bash replace

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

  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

5 个答案:

答案 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

}

之前回车

是唯一对我有用的东西。