搜索以短语开头的行并与下一行交换?

Search for line starting with phrase and swap with next line?

假设我有这样一个文件:

Stuff here
TERM here
Other stuff
Stuff here
TERM HERE
Additional stuff
End of stuff

是否有一个 Linux 命令行工具可以找到所有以 TERM 开头的行并将整行与下一行交换,从而产生:

Stuff here
Other stuff
TERM here
Stuff here
Additional stuff
TERM HERE
End of stuff

非常感谢。

您可以将 Vim 非交互地用作 vim -e 或只是 ex 与此命令:

ex filename -u NONE -c 'g/^TERM/del | put' -c 'wq'

解释:

  • ex filename: 非交互式编辑 filename
  • -u NONE: 不要加载 vimrc 文件。
  • -c:运行加载文件后执行以下命令
  • g:global命令。它搜索模式,然后在找到的每个位置执行命令。
  • /^TERM/:要搜索的模式。 ^ 是匹配行首的特殊字符。 /s 用于分隔模式。
  • del: 删除当前行。
  • |:分隔命令。在这种情况下,delput。两者仍然是 g 命令的一部分。
  • put: 将删除的行粘贴到当前行之后。
  • wq:将文件写入磁盘并退出。这必须作为一个单独的 -c 参数而不是像 put 那样用 | 分隔,否则它会在只执行第一个匹配行后退出。