【问题标题】:Replacing content between two tags first occurence首次出现在两个标签之间替换内容
【发布时间】:2016-05-12 16:10:48
【问题描述】:

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

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">.....

所以在我执行之后,脚本会替换它直到最后一个&lt;/a&gt;,而不是替换到第一个&lt;/a&gt;

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

【问题讨论】:

    标签: replace sed tags


    【解决方案1】:

    ...class="logo"&gt;.*&lt;/a&gt; 中的 .* 是贪婪的,并且匹配任何字符,直到找到最后一个 &lt;/a&gt;

    如果你的开始和结束a标签在不同的行,你可以使用sed c命令:

    sed  -i -e '/<a href="\/" class="logo">/,/<\/a>/ c\
    <a href="/" class="logo">{{{ svg "/myLogo.svg" 100 100 }}} <img src="/logo.png"></a>
    ' file
    

    说明:

    • /&lt;a href="\/" class="logo"&gt;/,/&lt;\/a&gt;/ :此地址范围匹配从 /&lt;a href="\/" class="logo"&gt;/ 到下一个 /&lt;\/a&gt;/ 的所有行
    • c\ : change 命令,用以下文本替换匹配的行(\ 是用换行符开始替换)
    • ccommand 之后是替换文本。如果要替换为多行,则必须在每一行(最后一行除外)后添加\

    为了说明最后一点:

    sed -e '/fromtext/,/totext/ c\
    add line 1\
    add line 2\
    addline 3
    ' file
    

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

    【讨论】:

    • 很好的解决方案,非常感谢。如果你有时间可以解释一下你在这里使用 c\ 的方式,文档不是很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2014-09-29
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多