[英]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.