文件示例
line 1
line 2
line 3
line 4
line 4
应该在之后line 1
line 1
line 4
line 2
line 3
重要提示:它可能超过 4 行,脚本必须以某种方式理解它必须读取最后一行,不是第 4 行。
答案1
另一种更慢、更长的版本。
#!/bin/sh
if [ ! -f "$1" ]
then
printf "No input file\n"
exit
fi
FIRST=`head -n 1 "${1}"`
LAST=`tail -n 1 "${1}"`
MID=`sed -n '$d; 2,$p' "${1}"`
printf "${FIRST}\n${LAST}\n${MID}\n"
exit
速度较慢,因为每次使用head
,tail
和sed
来访问文件。在大文件(或许多文件)上,这可能非常明显。
答案2
$ printf '4m1\n,p\n' | ed -s file
line 1
line 4
line 2
line 3
简短的ed
脚本
4m1
,p
会将第四行移动到第一行之后,然后在终端中显示编辑缓冲区的内容。
要将结果保存到新文件,您可以使用类似的重定向
printf '4m1\n,p\n' | ed -s file >newfile
或者你可以告诉ed
保存文件
printf '4m1\nw newfile\n' | ed -s file
该命令w newfile
会将编辑的缓冲区保存到指定的文件中。没有文件名的命令w
会将文件保存回原始文件名。
由于行编辑器ed
将文件读入内存,因此如果文件大小合理但不是太大(小于千兆字节),则可以将其用于此类操作。
要移动最后的行,更改4
为$
上面命令中的。