繁体   English   中英

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

[英]Replace the same string several times with different strings in a file using 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 -es/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

作为解决方案的基础:

 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')

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

当搜索目标已知时,我更喜欢只匹配它,然后在我的替换字符串中再次键入它,而不是尝试捕获 ()s 内部的值并用 \1 引用。 再一次,只是它让维护编码人员更清楚地了解正在发生的事情。

我希望这有帮助

sed 's@home/user/[^/]*@var/django@' file

这是你要找的吗?

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

我在 bash 命令行上针对您的代码 ( filename ) 的副本运行了它,它很有用;

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

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

如果您想要一个 bash 脚本,您可以针对任何程序运行该脚本以更改传递给任何给定 function 的字符串,那么您可以使用它;

#!/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

我终于用了这个

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

}之前回车

是唯一对我有用的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM