我使用脚本使用命令获取文件的最后n-2行,然后使用echo将这些行打印到文件中。
last_n2_lines=`tail -n+3 $file`
echo "$last_n2_lines" >> $file
此回显此处从文件末尾删除一个尾随的新行。 仅供参考
tail -n + 3文件> file.new
工作得很好。
答案 0 :(得分:3)
来自手册:http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution
3.5.4命令替换
命令替换允许输出命令来替换 命令本身。封闭命令时会发生命令替换 如下:
$(command)
或
`command`
Bash通过执行命令并用标准输出替换命令替换来执行扩展 命令, 删除了任何尾随换行符 。嵌入式换行 不会被删除,但在分词时可能会删除它们。该 命令替换$(cat文件)可以用等效的替换 更快$(< file)。
当使用旧式反引号替换形式时,反斜杠 保留其字面含义,除非后跟'$','`'或'\'。 第一个不带反斜杠的反引号终止命令 代换。使用$(命令)表单时,所有字符之间 括号组成命令;没有人受到特别对待。
命令替换可以嵌套。使用反引号时嵌套 形式,用反斜杠逃避内部反引号。
如果替换出现在双引号内,则分词和 不对结果执行文件名扩展。
强调我的。所以这不是一个错误。这是一个特色。
答案 1 :(得分:2)
您可以使用readarray
保存数据来保留尾随空行,并使用printf
保存输出。
类似的东西:
readarray last_n2_lines < <(tail -n+3 $file)
printf "%s" "${last_n2_lines[@]}" > ${file}.new
演示:
$ cat test; echo end
1
2
3
4
end
$ tail -n+3 test ; echo end
3
4
end
$ readarray data < <(tail -n+3 test)
$ printf "%s" "${data[@]}" ; echo end
3
4
end
说明:
readarray data
从标准输入读取名为data
的数组中的行。cmd1 < <(cmd2 param1 param2 ...)
,cmd2 param1 param2 ...
会将cmd1
的输出重定向到标准输入。请注意语法:它必须是< [space] <(...)
,<(
之间没有空格,两者之间需要空格< <
。因此,在第一行之后,data
包含tail -n+3
输出的所有行。数组中的每个项目都是输入的一行,其中包含行终止符
以下是访问每个元素的方法。请注意,为数组中定义的每个项打印两行:数组中的一行(包含换行符)和echo
添加的换行符。
$ echo "${data[0]}"
3
$ echo "${data[1]}"
4
$ echo "${data[2]}"
$ echo "${data[3]}"
$ echo "${data[4]}" # out of bounds
$
${data[@]}
扩展为数组data
printf "%s" param1 param2 ...
打印所有参数不变(即不添加或删除行终止符)。因此,第二个语句打印回读的所有内容,未更改。