首先更换两个标签之间的内容

时间:2016-05-10 21:52:38

标签: replace sed tags

我正在尝试使用以下表达式替换标记之间的某些内容

sed -i -e ':a;N;$!ba' -e 's#<a href="/" class="logo">.*</a>#<a href="/" class="logo">{{{ svg "/myLogo.svg" 100 100 }}} <img src="/logo.png"></a>#' $file

我面临的问题是我将其应用于如下文字:

<div class="bar">
    <a href="/" class="logo">
        <svg viewBox="13.195 149.965 803 267.334">
                <path fill="#6A5B53" d="M233.773,218.468l-6.19,65.33c-3.429-29.427-19.904-64.188-41.427-82.473
                    c0.667-1.048-0.381-8,0.476-8.856L266.773,218.468z"/>
                <path fill="#FFC3B7" d="M260.583,285.894c0.476-63.331-51.236-116.662-115.424-116.377/>
     </svg>
                <image src="/logo.jpg">          </svg>
    </a>

    <ul class="newmenu"><li><a href="/char" title="">Char</a></li>
<li><a href="/price" title="">Price</a></li>
<li><a href="/account" title="">Account</a></li>
<li><a href="/login" title="">Login</a></li>
</ul>    <div class="log">.....

因此,在我执行它之后,脚本会将其替换为最后一个</a>,而不是替换为第一个</a>

如何防止一直更换到最后一个标签?

1 个答案:

答案 0 :(得分:0)

.* ...class="logo">.*</a>中的</a>贪婪并匹配任何字符,直到找到上一个a

如果您的开始和结束c标记位于不同的行,则可以使用sed sed -i -e '/<a href="\/" class="logo">/,/<\/a>/ c\ <a href="/" class="logo">{{{ svg "/myLogo.svg" 100 100 }}} <img src="/logo.png"></a> ' file 命令:

/<a href="\/" class="logo">/,/<\/a>/

说明:

  • /<a href="\/" class="logo">/:此地址范围与/<\/a>/到下一个c\的所有行匹配
  • \更改命令,用以下文字替换匹配的行(c是用新行开始替换)
  • \命令之后是替换文本。如果要替换多行,则必须向每行添加尾随sed -e '/fromtext/,/totext/ c\ add line 1\ add line 2\ addline 3 ' file (最后一行除外)。

说明最后一点:

c

在某些sed版本中,您可以在sed '/fromtext/ c newtext' file之后的同一行写下替换文字(例如{{1}})。