如何用sed做多个模式替换

时间:2017-02-28 20:28:27

标签: regex linux unix sed

这是我的文件example.txt

{foo}
{bar}
{f}oo}
{ba{r}
{fo}o}
{b{ar}

我想要这个结果:

<div class="id">foo</div>
<div class="id">bar</div>
<div class="id">f}oo</div>
<div class="id">ba{r</div>
<div class="id">fo}o</div>
<div class="id">b{ar</div>

我在记事本++中有命令获得上面的结果

([}]\r\n)|(\r\n[{])|(^[{])|([}]$)
(?1}</div>)(?2<div class="id">{)(?3<div class="id">{)(?4}</div>)

我尝试了这个sed命令

sed -i 's@}\r\n@</div>@g' *.html

这使我的文件保持不变。如何使用sed正确执行此操作?

4 个答案:

答案 0 :(得分:2)

使用以下sed命令和特定的正则表达式模式:

sed -ri 's/\{(.+)\}/<div class="id">\1<\/div>/g' testfile

-r选项允许扩展正则表达式

\{(.+)\} - 匹配用大括号{}

括起的任何字符

\1 - 指向第一个捕获的组(.+)

答案 1 :(得分:1)

如何使用两个简单的表达式,如下所示:

sed -i '' -e 's/^./<div class="id">/;s/.$/<\/div>/' file
  • 将第一个字符替换为<div class="id">,将最后一个字符替换为</div>,保留该行的其余部分。
  • 不需要任何捕获组

给出这个输出:

<div class="id">foo</div>
<div class="id">bar</div>
<div class="id">f}oo</div>
<div class="id">ba{r</div>
<div class="id">fo}o</div>
<div class="id">b{ar</div>

答案 2 :(得分:0)

怎么样

sed -e 's/{\(.*\)}/<div class="id">\1<\/div>/'

sed是面向行的,所以你不会在记录中找到\n(除非你使用了一些高级命令)。

答案 3 :(得分:0)

您可能会对用户 Perl

感兴趣
$ cat file
{foo}
{bar}
{f}oo}
{ba{r}
{fo}o}
{b{ar}
$
$ perl -lpe 's/^.(.*?).$/<div class="id">\1<\/div>/' file
$ 
<div class="id">foo</div>
<div class="id">bar</div>
<div class="id">f}oo</div>
<div class="id">ba{r</div>
<div class="id">fo}o</div>
<div class="id">b{ar</div>

它还有保存,例如sed -i