2013-07-19 69 views
3

在我的Bash腳本中,我寫了一行文本文件。刪除文本文件的最後一行,而不是附加一個?

echo "string" > /folder/file.txt 

以上示例創建一個新文件並將該字符串寫入該文件。

echo "string" >> /folder/file.txt 

第二個示例附加到文件,將字符串寫入新行。

我的問題是...是否有一個命令刪除最後一行?如果沒有,我想我必須逐行復制到一個臨時文件中,在我想刪除的最後一行之前停止,然後用新文件覆蓋舊文件(現在沒有最後一行) 。如果這是唯一的解決方案,有沒有辦法找出文本文件中有多少行?所以我可以在「n - 1」停止循環。

回答

6

假設你有GNU頭:

$ head -n -1 file 

打印所有,但最後一個(-1)線。

+0

非常感謝您,非常適合我的需求。我使用** head -n -1 fromfile> tofile **將它打印到一個文件中。出於好奇,對原始文件進行更改的最簡單方法是什麼?我是否必須將** head **用於臨時文件,然後移動臨時文件覆蓋原始文件?或者也許有一個小竅門? – Paolo

4
{ echo 1; echo 2 ; echo 3 ; } | sed '$d' 

輸出

1 
2 

或與文件

sed '$d' file > file.tmp && mv file.tmp file 

OR與更新的SEDS

sed -i '$d' file 

$字符被視爲範圍地址值,意思是'最後一行文件'。您還會在正則表達式中看到$,如'/行尾$ /'(注意'/.../'的reg-exp分隔符對)。當一個reg表達式中使用,$現在意味着「結束行」

如果你真的想知道有多少行的文件(並將其分配給一個變量),做

lineCount=$(/bin/wc -l <file) 

echo $lineCount 

IHTH

2

這裏是你會如何使用awk做到這一點:

$ seq 1 5 | awk 'NR>1{print l}{l=$0}' 
1 
2 
3 
4 

使用perl

$ seq 1 5 | perl -ne 'print if !eof' 
1 
2 
3 
4 

或者如果你喜歡井字棋! (使用tacsed):

$ seq 1 5 | tac | sed '1d' | tac 
1 
2 
3 
4 
+0

哦,來吧,我相信你知道'sed'$ d''。爲什麼'tac + sed + tac'? :P – anishsane

+3

但是'sed'$ d''已發佈!使用'tac'似乎很有趣。 – devnull

相關問題