echo从输出中删除空白的最后一行

时间:2013-02-10 08:43:14

标签: bash shell echo tail

我使用脚本使用命令获取文件的最后n-2行,然后使用echo将这些行打印到文件中。

last_n2_lines=`tail -n+3 $file`
echo "$last_n2_lines" >> $file

此回显此处从文件末尾删除一个尾随的新行。 仅供参考

  

tail -n + 3文件> file.new

工作得很好。

2 个答案:

答案 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 ...打印所有参数不变(即不添加或删除行终止符)。

因此,第二个语句打印回读的所有内容,未更改。