【问题标题】:Sed - Move/Insert text from the hold bufferSed - 从保持缓冲区移动/插入文本
【发布时间】:2014-09-23 18:58:24
【问题描述】:

我是 sed 的新手。

我有

--
-- data_table
--
Insert Statement

More stuff

Last Line

我想将插入语句(上面带有表格注释)移到最后一行之前。

我有这个把它移到最后:

sed '/-- data_table/,/Insert Statement/{H;d};$g' >> file.sql

生产:

--

More stuff

Last Line

-- data_table
--
Insert Statement

这行得通,不过我想要的是我上面提到的。我试着用这个:

sed '/-- data_table/,/Insert Statement/{H;d};/Last Line/ig' >> file.sql

但这只是在最后一行之前加上一个“g”,没有其他任何作用。很明显我做错了什么,还是 /i\ 只能与定义的文本一起使用?

如果有人知道我如何也可以移动整个部分,那么请注意一个不太重要的说明

--
-- data_table
--

而不仅仅是最后两行,那就太好了。我试过了:

 sed '/--\n-- data_table/,/Insert Statement/{H;d};$g' >> file.sql

但它不起作用。

谢谢

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    这可能对你有用(GNU sed):

    sed '/--/{:a;N;/data_table/!{P;D};/Insert Statement/!ba;h;d};/Last Line/{H;g}' file
    

    查找注释行,如果下一行/或当前行包含data_table,则继续收集行直到Insert Statement,然后将这些行存储在保持空间(HS)中并删除这些行。在遇到Last Line 时,将此行附加到 HS 并用 HS 的内容替换当前行。

    注意如果注释行或以下行不包含data_table,则释放第一行并重新开始该过程。此外,如果有多个Last Line,这些也会以相同的方式处理。

    【讨论】:

      【解决方案2】:
      sed '/-- data_table/,/Insert Statement/{H;d};/Last Line/ G' >> file.sql
      
      • i 不是在这里插入,而是s/// 的一个选项,意思是不区分大小写
      • g 也是 s/// 的一个选项,意思是“每一次发生”
      • G(单独)是追加到缓冲区,g 是替换缓冲区

      因此您需要删除i,将gs///command 分开并使用wanteg g/G

      小心如果有几个 /Last line/ 和 /data_table,/Insert/ 存在,你肯定不会从第二次出现到最后得到想要的结果

      【讨论】:

        【解决方案3】:
        sed '/--/,/Insert Statement/{H;d};/Last Line/{x;p;x}' >> file.sql
        

        {x;p;x} 执行以下操作:

        • 与保持缓冲区交换模式空间(最后一行进入缓冲区,插入语句 - 进入模式空间)
        • 打印模式空间(插入语句)
        • 再次与保持缓冲区交换模式空间(最后一行进入模式空间)

        顺便说一句,将-- data_table 更改为-- 解决了匹配不完整评论的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-03
          • 2011-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多