我想使用SED将多行移动到文件末尾。例如:
ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ1234
应该成为:
STUVWX
YZ1234
ABCDEF
GHIJKL
MNOPQR
答案 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
如果您已熟悉head
和tail
,这可能是将前三行移至末尾的更简单方法:
$ 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
h
,H
和G
命令的组合消除了替换命令删除额外换行符的需要。
答案 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'