Sed - 从保持缓冲区移动/插入文本

时间:2014-09-23 10:04:51

标签: bash sed

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

但这只是放入了一个'在最后一行之前,没有别的。显然,我做错了什么,或者只能在它之后使用定义的文本?

如果有人知道我怎么也可以移动整个

,那么就不那么重要了
--
-- data_table
--

而不仅仅是它的最后两行会很棒。我试过了:

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

但它没有用。

由于

3 个答案:

答案 0 :(得分:1)

sed '/-- data_table/,/Insert Statement/{H;d};/Last Line/ G' >> file.sql
  • i不适用于此处插入,但s///的选项表示不区分大小写
  • g也是s///的选项,意思是'每次出现'
  • G(单独)附加到缓冲区g替换缓冲区

因此您需要删除i,将g表单s///命令分开并使用wanteg g / G

如果存在多个/ Last line /和/ data_table,/ Insert /,请注意,你肯定没有从第二次出现到最后的想要的结果

答案 1 :(得分: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的内容。

N.B。如果注释行或后续行不包含data_table,则释放第一行并再次开始该过程。此外,如果有多个Last Line,这些也将以相同的方式处理。

答案 2 :(得分:1)

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

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

  • 使用保持缓冲区交换模式空间(Last Line转到缓冲区,Insert Statement - 转换为模式空间)
  • 打印图案空间(插入声明)
  • 再次使用保持缓冲区交换模式空间(最后一行转到模式空间)

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