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

时间:2014-10-17 21:25:58

标签: sed lines

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

ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ1234

应该成为:

STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR

3 个答案:

答案 0 :(得分: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

说明:

  • 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  

使用头部和尾部

如果您已熟悉headtail,这可能是将前三行移至末尾的更简单方法:

$ tail -n+4 file; head -n3 file
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR

替代sed命令

在评论中,Potong建议:

$ sed '1,3{1h;1!H;d};$G' file
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR

hHG命令的组合消除了替换命令删除额外换行符的需要。

答案 1 :(得分:0)

使用awk

尝试此操作
awk '{print $4,$5,$1,$2,$3}' file
STUVWX YZ1234 ABCDEF GHIJKL MNOPQR

PS,这是多个字段,而不是行。

将其写回原始文件

awk '{print $4,$5,$1,$2,$3}' file > tmp && mv tmp file

如果数据采用以下格式:

cat file
ABCDEF
GHIJKL
MNOPQR
STUVWX

然后这可能会:

awk '{a[NR]=$0} END {print a[4],a[5],a[1],a[2],a[3]}' OFS="\n" file
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR

答案 2 :(得分:0)

简单的ex应该做到:

ex file <<< $'1,3m$\nw'