【问题标题】:echo removes a blank last line from the outputecho 从输出中删除最后一行空白
【发布时间】:2013-02-10 08:43:13
【问题描述】:

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

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

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

tail -n+3 文件 > file.new

运行良好。

【问题讨论】:

标签: bash shell echo tail


【解决方案1】:

来自手册:http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution

3.5.4 命令替换

命令替换允许命令的输出替换 命令自己。包含命令时发生命令替换 如下:

$(command)

`command`

Bash 通过执行命令并将命令替换替换为标准输出来执行扩展 命令,删除任何尾随换行符。嵌入式换行符 不会被删除,但它们可能会在分词过程中被删除。这 命令替换 $(cat file) 可以替换为等效但 更快的 $(

当使用旧式反引号形式的替换时,反斜杠 保留其字面意思,除非后面跟“$”、“`”或“\”。 前面没有反斜杠的第一个反引号会终止命令 替代。使用 $(command) 形式时,所有字符之间 括号构成命令;没有人受到特殊对待。

命令替换可以嵌套。使用反引号时嵌套 形式,用反斜杠转义内部反引号。

如果替换出现在双引号内,分词和 不会对结果进行文件名扩展。

强调我的。所以这不是一个错误。这是一个功能。

【讨论】:

  • 我应该如何防止删除尾随的新行??我试过 last_n2_lines=$(tail -n +3 $file; echo -n x) last_n2_lines="${last_n2_lines%x}" 但这不起作用
  • 解决方法是echo -e "\n" >> $file,但这仅适用于您知道存在换行符的情况。
【解决方案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 的数组中。
  • 如果cmd1cmd1 &lt; &lt;(cmd2 param1 param2 ...)cmd2 param1 param2 ... 的输出重定向到标准输入。注意语法:它必须是&lt; [space] &lt;(...)&lt;( 之间没有空格,两个&lt; &lt; 之间需要空格。

所以在第一行之后,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 ... 打印其所有参数不变(即不添加或删除行终止符)。

所以第二个语句打印回读入的所有内容,保持不变。

【讨论】:

  • 添加了一个演示。请永远记住:“不工作”不是一个有用的说法。描述它是如何不工作的。
  • 哦抱歉含糊不清...实际上我正在对数组变量进行回显。在尝试 printf 时,它工作得很好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多