sed或awk将第一个模式对之间的一块文本移动到第二个模式对中?

sed或awk将第一个模式对之间的一块文本移动到第二个模式对中?,sed,awk,Sed,Awk,我需要处理一个文本文件。需要将第一个模式对之间的文本块移动到第二个模式对中(在第二个模式对之间已经存在的文本块之上) 样本输入: ...many lines of text [pattern] chunk of text text I need to move [/pattern] ...more lines of text [pattern] something here or empty [/pattern] ...more lines of text …许多行文本 [模式] 文本块 文本我

我需要处理一个文本文件。需要将第一个模式对之间的文本块移动到第二个模式对中(在第二个模式对之间已经存在的文本块之上)

样本输入:

...many lines of text [pattern] chunk of text text I need to move [/pattern] ...more lines of text [pattern] something here or empty [/pattern] ...more lines of text …许多行文本 [模式] 文本块 文本我需要移动 [/pattern] …更多行文本 [模式] 这里有东西还是空的 [/pattern] …更多行文本 非预期产出:

...many lines of text [pattern] [/pattern] ...more lines of text [pattern] chunk of text text I need to move something here or empty [/pattern] ...more lines of text …许多行文本 [模式] [/pattern] …更多行文本 [模式] 文本块 文本我需要移动 这里有东西还是空的 [/pattern] …更多行文本 有没有任何sed或awk命令可以做到这一点?我搜索了整个网络,但都无法让它工作。谢谢!

Ruby(1.9+)

#!/usr/bin/awk -f

/\[pattern\]/ {
    flag = 1
    count++
    print
    next
}

flag == 1 && count == 2 {
    print accum
    accum = ""
    flag = 0
}

/\[\/pattern\]/ {flag = 0}

flag == 0 {print}
flag == 1 && count == 1 {
    accum = accum delim $0
    delim = RS
}
试运行

$ cat file    
1 2 3
[pattern]
chunk of text
text I need to move
[/pattern]
4 5 6
[pattern]
something here or empty
[/pattern]
7 8 9    
[pattern]
blah blah
[/pattern]

$ ruby script.rb    
1 2 3
[pattern]
[/pattern]
4 5 6
[pattern]
chunk of text
text I need to move

something here or empty
[/pattern]
7 8 9    
[pattern]
blah blah
[/pattern]
红宝石(1.9+)

试运行

$ cat file    
1 2 3
[pattern]
chunk of text
text I need to move
[/pattern]
4 5 6
[pattern]
something here or empty
[/pattern]
7 8 9    
[pattern]
blah blah
[/pattern]

$ ruby script.rb    
1 2 3
[pattern]
[/pattern]
4 5 6
[pattern]
chunk of text
text I need to move

something here or empty
[/pattern]
7 8 9    
[pattern]
blah blah
[/pattern]

有两个以上这样的块吗?如果有,你如何区分从哪个块移动到哪个块?这可以在
sed
中完成,但会非常复杂。在AWK中,这非常简单。有两个以上这样的块吗?如果有,你如何区分从哪个块移动到哪个块?这是可以做到的在
sed
中,它会很毛茸茸的。在AWK中,它很简单。这与我想要的很接近,但在第二个模式对之间没有任何内容时它就不起作用了。比如:
…许多行文本[pattern]文本块我需要移动[/pattern]…更多行文本[pattern]在这里或是空的[/pattern]…更多的文本行
我以前的回答不正确。当第二个模式对之间没有任何内容时,脚本似乎不起作用。很抱歉打扰您,但我不太了解awk,无法快速找出答案。@May:我只需要更改一些语句的顺序来解决该问题。请现在再试一次。太好了。非常感谢,丹尼斯!这和我要找的很接近,但当第二个模式对之间没有任何内容时,它就不起作用了。比如:
…许多行文本[pattern]文本块我需要移动[/pattern]…更多行文本[pattern]此处或空[/pattern]…更多的文本行
我以前的回答不正确。当第二个模式对之间没有任何内容时,脚本似乎不起作用。很抱歉打扰您,但我不太了解awk,无法快速找出答案。@May:我只需要更改一些语句的顺序来解决该问题。请现在再试一次.太好了。非常感谢,丹尼斯!