阿罗哈,我一直在试图找出如何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()
将/ ch-de /中的urlredirect到/ de /并使用?redirecturl 和“
在Nginx位置的前瞻正则expression式
鉴于你的解释,我只能提出这个简单的代码:
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
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] 举报,一经查实,本站将立刻删除。