2013-02-10 950 views
2

我正在使用腳本來獲取文件的最後n-2行,然後使用echo將這些行打印到文件中。echo從輸出中刪除最後一行

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

此處的回顯從文件尾部刪除尾隨的新行。 FYI

尾-n + 3文件> file.new

工作得很好。

+0

你問一個問題,或只是注意到? :) – robertklep 2013-02-10 09:30:46

+0

可能的重複[如何避免bash命令替換刪除換行符?](http://stackoverflow.com/questions/15184358/how-to-avoid-bash-command-substitution-to-remove-the -newline-character) – user000001 2013-04-09 13:56:57

回答

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 ...)如果cmd1cmd2 param1 param2 ...的輸出重定向到標準輸入。注意語法:它必須是< [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 ...打印它的所有參數保持不變(即不添加或移除行終止)。

因此,第二條語句將所有讀入的內容打印回來,保持不變。

+0

可以解釋上述命令,因爲它不適用於我... – 2013-02-10 11:17:21

+1

添加了演示。請永遠記住:「不工作」並不是一件有用的事情。描述它是如何工作的。 – Mat 2013-02-10 11:35:24

+0

哦,對不起模糊......其實我是在數組變量上做回聲。在嘗試printf它完美的作品。謝謝 – 2013-02-10 11:52:26

3

從手冊:http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution

3.5.4命令替換

命令替換允許命令的輸出,以取代 命令本身。

$(command) 

`command` 

擊通過執行命令,並與 命令的標準輸出替換命令替換執行膨脹,:當一個命令括 如下發生命令替換任何尾隨的換行符被刪除。嵌入換行 不會被刪除,但它們可能會在分詞過程中被刪除。 命令替換$(cat file)可以用相當於 的$(<文件)代替。

當使用舊式反引號替換形式時,反斜槓 保留其字面含義,除非後面跟有'$','`'或'\'。 不帶反斜槓的第一個反引號終止命令 替換。當使用$(command)形式時,括號中的所有字符構成命令 ;沒有人專門處理。

命令替換可以嵌套。要使用反向引用的 表單嵌套​​時,請用反斜槓將內部反引號排除。

如果替換出現在雙引號內,則不會對結果執行文字分割和 文件名擴展。

強調我的。所以這不是一個錯誤。這是一個功能。

+0

我應該如何防止這種刪除拖尾的新行?我試過last_n2_lines = $(tail -n +3 $ file; echo -nx) last_n2_lines =「$ {last_n2_lines%x}」 但這不起作用 – 2013-02-10 09:55:50

+0

解決方法是'echo -e「\ n」>> $文件「,但僅適用於知道存在換行符的情況。 – user000001 2013-02-10 10:00:01