我正在使用腳本來獲取文件的最後n-2行,然後使用echo將這些行打印到文件中。echo從輸出中刪除最後一行
last_n2_lines=`tail -n+3 $file`
echo "$last_n2_lines" >> $file
此處的回顯從文件尾部刪除尾隨的新行。 FYI
尾-n + 3文件> file.new
工作得很好。
我正在使用腳本來獲取文件的最後n-2行,然後使用echo將這些行打印到文件中。echo從輸出中刪除最後一行
last_n2_lines=`tail -n+3 $file`
echo "$last_n2_lines" >> $file
此處的回顯從文件尾部刪除尾隨的新行。 FYI
尾-n + 3文件> file.new
工作得很好。
通過使用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 ...)
如果cmd1
將cmd2 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 ...
打印它的所有參數保持不變(即不添加或移除行終止)。因此,第二條語句將所有讀入的內容打印回來,保持不變。
可以解釋上述命令,因爲它不適用於我... – 2013-02-10 11:17:21
添加了演示。請永遠記住:「不工作」並不是一件有用的事情。描述它是如何工作的。 – Mat 2013-02-10 11:35:24
哦,對不起模糊......其實我是在數組變量上做回聲。在嘗試printf它完美的作品。謝謝 – 2013-02-10 11:52:26
從手冊:http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution
3.5.4命令替換
命令替換允許命令的輸出,以取代 命令本身。
$(command)
或
`command`
擊通過執行命令,並與 命令的標準輸出替換命令替換執行膨脹,:當一個命令括 如下發生命令替換任何尾隨的換行符被刪除。嵌入換行 不會被刪除,但它們可能會在分詞過程中被刪除。 命令替換$(cat file)可以用相當於 的$(<文件)代替。
當使用舊式反引號替換形式時,反斜槓 保留其字面含義,除非後面跟有'$','`'或'\'。 不帶反斜槓的第一個反引號終止命令 替換。當使用$(command)形式時,括號中的所有字符構成命令 ;沒有人專門處理。
命令替換可以嵌套。要使用反向引用的 表單嵌套時,請用反斜槓將內部反引號排除。
如果替換出現在雙引號內,則不會對結果執行文字分割和 文件名擴展。
強調我的。所以這不是一個錯誤。這是一個功能。
我應該如何防止這種刪除拖尾的新行?我試過last_n2_lines = $(tail -n +3 $ file; echo -nx) last_n2_lines =「$ {last_n2_lines%x}」 但這不起作用 – 2013-02-10 09:55:50
解決方法是'echo -e「\ n」>> $文件「,但僅適用於知道存在換行符的情況。 – user000001 2013-02-10 10:00:01
你問一個問題,或只是注意到? :) – robertklep 2013-02-10 09:30:46
可能的重複[如何避免bash命令替換刪除換行符?](http://stackoverflow.com/questions/15184358/how-to-avoid-bash-command-substitution-to-remove-the -newline-character) – user000001 2013-04-09 13:56:57