【问题标题】:How to do multiple pattern replaces with sed如何用 sed 进行多模式替换
【发布时间】:2017-02-28 20:28:26
【问题描述】:

这是我的文件 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>

我在notepad++中有命令来得到上面的结果

([}]\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 正确执行此操作?

【问题讨论】:

    标签: regex linux unix sed


    【解决方案1】:

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

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

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


    \{(.+)\} - 匹配任何用花括号括起来的字符 {}

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

    【讨论】:

    • 你好坦克的答案,但你的命令对我不起作用,我已经编辑了我上面的问题,只用匹配的顶行和结束行替换 { 和 }
    • @kijiroluduatiga,检查我的更新,它适用于您的新输入示例
    【解决方案2】:

    如何使用两个简单的表达式,像这样:

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

    给出这个输出:

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

    【讨论】:

      【解决方案3】:

      怎么样

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

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

      【讨论】:

      • 如何替换 { } 内的多个括号,例如 {f}oo{bar},我想要结果
        f}oo{bar
        ,所以只有替换匹配的顶行和新行中的括号,使用 ^{ 和 }$ 在 sed 上不起作用
      【解决方案4】:

      您可能对用户 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多