我想使用SED 将多行移动到文件末尾.例如:
ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ1234
Run Code Online (Sandbox Code Playgroud)
应成为:
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
Run Code Online (Sandbox Code Playgroud)
该问题询问使用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
,H
和G
命令消除对替换命令,以除去额外的换行符的需要.