2014-09-23 39 views
0

我是sed的全新品牌。Sed - 从保持缓冲区移动/插入文本

-- 
-- data_table 
-- 
Insert Statement 

More stuff 

Last Line 

我想最后一行之前移动INSERT语句(与上面的表格注释)来。

我有这样的把它移动到结束:

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',并且什么都不做。很明显,我做错了什么,或者只能用于后面的定义文本?

还就不太重要音符,如果有人知道我怎么还可以移动整个

-- 
-- data_table 
-- 

,而不是仅在过去2行的它,将是巨大的。我试过:

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

但它不起作用。

感谢

回答

1

这可能会为你工作(GNU SED):

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

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

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

1
sed '/-- data_table/,/Insert Statement/{H;d};/Last Line/ G' >> file.sql 
  • i不是在此处插入但s///选项taht意味着不区分大小写
  • g也是s///意味着 '每一次出现'
  • G一个选项(单独)追加到缓冲区,其中g代替缓冲区

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

要小心,如果数/尾线/和/ data_table,/插入/都存在,你certainaly没有从第二occurence想要的结果到底

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

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

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

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