我正在尝试使用以下表达式替换标记之间的某些内容
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>
。
如何防止一直更换到最后一个标签?
答案 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}})。