SED:将多行移动到文本文件的末尾

Nek*_*roi 1 sed lines

我想使用SED 将多行移动到文件末尾.例如:

ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ1234
Run Code Online (Sandbox Code Playgroud)

应成为:

STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 6

该问题询问使用sed移动多行的方法.虽然目前编辑的问题没有显示多行,但我认为它们实际上是分开的行.

要用于sed将前三行移动到结尾:

$ cat file
ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ1234
$ sed '1,3{H;d}; ${p;x;s/^\n//}' file  
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
Run Code Online (Sandbox Code Playgroud)

说明:

  • 1,3{H;d}

    1,3这些命令限制为仅在第1 行到第3行上操作. H告诉sed将当前行保存到保持缓冲区. d告诉我sed不要打印当前行.

  • ${p;x;s/^\n//}

    $限制此命令的最后一行.该p通知sed打印的最后一行. x交换模式缓冲区并保持缓冲区.我们从文件开头保存的行现在可以打印了.但是,在打印之前,我们删除了无关的前导换行符.

  • 在继续下一行之前,sed将打印模式缓冲区中剩余的任何内容.

如果您使用的是Mac OSX或其他BSD平台,请尝试:

sed -e '1,3{H;d;}' -e '${p;x;s/^\n//;}' file  
Run Code Online (Sandbox Code Playgroud)

使用头部和尾部

如果您已经熟悉head并且tail这可能是将前三行移动到最后的更简单方法:

$ tail -n+4 file; head -n3 file
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
Run Code Online (Sandbox Code Playgroud)

替代sed命令

在评论中,potong建议:

$ sed '1,3{1h;1!H;d};$G' file
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
Run Code Online (Sandbox Code Playgroud)

的组合h,HG命令消除对替换命令,以除去额外的换行符的需要.

  • 一个更简单的 sed 解决方案可能是:`sed '1,3{1h;1!H;d};$G' file` (2认同)