linux技巧

sed替换2个特征字符串中间的内容

例如,典型的替换html代码片段,有1.html这个文件:

<script><script src="https://abc.com/hao.js"></script><script src="https://abc.com/hm.js"></script><script src="http://efg.com/ok.js" id="123"></script><script>

以上内容都是在一行,把其中的颜色字体去掉,可以这样:

公式:sed 's/startsrting.*endstring//'
命令(双引号和斜杠都要进行转义):
sed 's/<script src=\"http:\/\/efg.com.*<\/script>//' 1.html

结果为:

<script><script src="https://abc.com/hao.js"></script><script src="https://abc.com/hm.js"></script><script>

但是,如果替换的内容不在一行,在多行里,比如:

sed替换2个特征字符串中间的内容

那么上面的命令就不好使了,可以用下面的命令:

公式:sed "/startstring/,/endstring/d" 
命令:
sed "/<script src=\"http:\/\/efg.com/,/<\/script>/d" 1.html

结果为:

<script>
<script src="https://abc.com/hao.js"></script>
<script src="https://abc.com/hm.js"></script>
</script>

再进一步,如果开头的部分混杂在一行中,可以用换行符进行填入,然后再次进行替换

先将:
<div id="search"> <form action="https://moneyslow.com/plus/search.php" name="formsearch">
执行:sed -i 's/<form/\n<form/g' 改为:
<div id="search"> 
<form action="https://moneyslow.com/plus/search.php" name="formsearch">
再次执行多行删除:
sed -i "/<form action=/,/<\/form>/d"

参考:https://unix.stackexchange.com/questions/94616/removing-text-between-two-specific-strings