我有一个结构如下的文件:
M: a
M: b
Player: c
M: d
Sequencer.Play( SpineAnimation(foo, speaker)@0 )
Player: e
M: f
Sequencer.Play( SpineAnimation(bar, speaker)@0 )
...
我如何将其转换为这样的文件:
M: a
M: b
Player: c
M foo: d
Player: e
M bar: f
...
换句话说,如果下一行有Sequencer.Play( SpineAnimation(...
,我想把它后面的单词放在当前行的冒号之前。
不确定最好的工具是什么,我在想 awk,但话又说回来,我认为使用该工具会非常麻烦。我愿意使用任何命令来完成此任务。我尝试做类似这里答案的事情:将两行合并为一行,从两行中选择选定的单词 但这个问题似乎非常不同,因为这条Sequencer.Play
线并不总是存在。
答案1
您可以使用 sed 尝试这样的操作:
$ sed -e 'N;s/M:\(.*\)\nSequencer.Play( SpineAnimation(\([^,]*\).*/M \2:\1/' -e 'P;D' file
M: a
M: b
Player: c
M foo: d
Player: e
M bar: f
N
...命令P;D
在模式空间中维护一个 2 行缓冲区,然后该命令匹配 2 行模式,捕获和换行符s
之间的部分,以及从和 后面的部分,并在M
SpineAnimation(
,
M