我是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
但它没有用。
由于
答案 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}
执行以下操作:
顺便说一句,将-- data_table
更改为--
可解决匹配不完整评论的问题。