微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在两个占位符之间查找并replacevariables内容

阿罗哈,我一直在试图找出如何replace/插入两个占位符之间的文本string。

#start REPLACE ANYTHING IN HERE #end

最初我试图通过sed与BASH做到这一点,但当我试图将一个variables传递给sed时遇到了障碍。

sed -n -i '/#start/{p;:a;N;/#end/!ba;s/.*n/hellon/};p' file.txt

返回

#start hello #end

但是当我尝试时没有快乐

用grep或sed合并两行

bash – 如何从bash脚本内传递一个换行到perl?

如果在使用正则expression式的开始词之前出现closures词,则在两个词之间find不匹配的词

正则expression式问题Bash

在linux中将日志输出更改为configuration文件

sed -n -i '/#start/{p;:a;N;/#end/!ba;s/.*n/$replace_varn/};p' file.txt

要么

sed -n -i "/#start/{p;:a;N;/#end/!ba;s/.*n/$replace_varn/};p" file.txt

我已经在这个几个小时了,已经四处搜寻,但还没有find解决办法。 我正在尝试在Python或其他语言,或者可能与awk。 我在这个领域有点新,所以任何有用的信息将不胜感激。

提前致谢

这是我最后的结果。 这是一个与cron结合的脚本,使用最新发布的ssh阻止列表更新我的/var/etc/hosts.deny文件

import re import urllib2 hosts_deny = open('/etc/hosts.deny','r+') hosts_deny_text = hosts_deny.read() blockedHosts = urllib2.urlopen('http://www.openbl.org/lists/hosts.deny').read() place = re.compile('(?<=#start)(r?n)' '(.*?)' '(?=r?n#end)',re.DOTALL)#DOTALL enables '.' to also include #a new line hosts_deny_text = re.sub(place,'n'+ blockedHosts,hosts_deny_text) hosts_deny.seek(0) hosts_deny.write(hosts_deny_text) hosts_deny.close()

如何使用bat文件脚本replace文本文件中的文本?

将/ ch-de /中的urlredirect到/ de /并使用?redirecturl 和“

Nginx位置的前瞻正则expression式

脚本将命名空间添加到C ++文件

如何用空格列出所有文件后面的PHP标签

鉴于你的解释,我只能提出这个简单的代码

import re ss = '''qslkjqskqsdhf #start REPLACE ANYTHING IN HERE #end 2135468761265 ''' reg = re.compile('(?<=#start)(r?n)' '(.*?)' '(?=r?n#end)',re.DOTALL) print ss print '----' print reg.sub('\1Ia orana',ss)

结果

qslkjqskqsdhf #start REPLACE ANYTHING IN HERE #end 2135468761265 ---- qslkjqskqsdhf #start Ia orana #end 2135468761265

这似乎做你想要的:

sed -ie "/#start/,/#end/{/#start/b;/#end/b;s/.*/$replace_var/;}" file.txt

内部/#start/b和/#end/b跳过这些行,否则你会替换它们。

我认为sed是不适合这个任务,我会用awk来代替:

awk '!f; /#start/ { f=1; print repl } /#end/ { f=0; print }' repl="$replace_var" file.txt

f变量是一个标志,用于跟踪我们在标记内的时间。 !f调用认块( {print $0} )并打印包括#start标记在内的#start标记

测试

从eyquem的答案复制的测试文件

cat << EOF > file.txt qslkjqskqsdhf #start REPLACE ANYTHING IN HERE #end 2135468761265 EOF

用hellonhello替换标记内容

awk '!f; /#start/ { f=1; print repl } /#end/ { f=0; print }' repl="$(printf 'hellonhello')" file.txt

输出

qslkjqskqsdhf #start hello hello #end 2135468761265

你可以将文件读入一个字符串,然后:

sstart = s.split(start) for i in range(len(s)): if i%2 ==1: send = sstart[i].split(end) for i in range(len(send)): if i%2 == 0: send[i] = REPLACEMENT sstart[i] = send.join() s = sstart.join()

所以你基本上是通过列表,删除需要更换的部分,然后粘贴在一起。

用“dotall”正则表达式,这很容易。 使用Perl,Python,PCRE等很容易。例如,在Python中:

>>> s = '''#start ... REPLACE ANYTHING IN HERE ... #end''' >>> re.sub(r'(?s)(#startn).*?n(#end)',r'1hellon2',s) '#startnhellon#end'

显然,匹配开始和结束行,并用自己替换它们是矫枉过正的,但是我决定保留它以防万一你想进一步扩展它。

我使用(?s)而不是传递re.DOTALL标志,所以一切都将是自包含的,你不必考虑Perl,Python等如何通过标志之间的差异。 但在现实生活中,使用标志而不是嵌入标志通常更具可读性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐