我想知道是否有辦法在bash中的文本文件的某一行之後刪除所有內容。所以說有一個10行的文本文件,我想刪除第4行後的每一行,所以只剩下前4行,我該如何去做?刪除bash中的某一行後的所有內容
回答
您可以使用GNU sed
:
sed -i '5,$d' file.txt
也就是說,5,$
表示範圍線5,直到結束,d
表示刪除。 只剩下前四行。 -i
標誌告知sed
就地編輯文件。
如果你只有BSD sed
,則-i
標誌需要備份的文件後綴:
sed -i.bak '5,$d' file.txt
由於@ephemient指出,雖然這種解決方案很簡單, 這是低效的,因爲sed
仍然會讀取輸入,直到文件的結尾,這是不必要的。
由於@agc指出,我的第一個建議的反向邏輯可能實際上更直觀。也就是說,不通過默認(-n
標誌), 打印並明確地打印範圍1,4
:
sed -ni.bak 1,4p file.txt
另一種簡單的替代方案中,假定第一4行也不會過長,所以它們容易地配合在存儲器中,並還假設第四線以換行符, 可以讀取前4行到存儲器中,然後覆蓋該文件結束時:
lines=$(head -n 4 file.txt)
echo "$lines" > file.txt
sed
方法@janos是簡單的,但低效率的。它會讀取原始文件中的每一行,甚至可以忽略它(儘管可以使用4q
修復),而-i
實際上會創建一個新文件(它將重命名以替換原始文件)。還有一個煩人的地方,你需要將GNU sed使用sed -i '5,$d' file.txt
,但使用BSD sed的sed -i '' '5,$d' file.txt
以刪除現有文件而不是留下備份。
dd bs=1 count=0 if=/dev/null of=file.txt \
seek=$(grep -b^file.txt | tail -n+5 | head -n1 | cut -d: -f1)
grep -b^file.txt
打印出的字節偏移上的每一行,例如:執行更少的I/O的另一種方法
$ yes | grep -b^ 0:y 2:y 4:y ...
tail -n+5
跳過前4行,輸出5 第和後續行head -n1
只對下一行(例如,僅5 第線)後
head
讀取一行,它將退出。這導致tail
退出,因爲它無處可輸。這導致grep
出於同樣的原因。因此,file.txt
的其餘部分不需要檢查。cut -d: -f1
只需要第一部分使用1個字節的塊大小:
(字節偏移)dd bs=1 count=0 if=/dev/null of=file.txt seek=N
之前,設法阻止
file.txt
N
從
/dev/null
複製0個大小爲1字節的塊到file.txt
截斷
file.txt
這裏(因爲conv=notrunc
未給出)
總之,這消除了對5個和後續行從
file.txt
的所有數據。在Linux上有一個名爲
fallocate
的命令,它可以類似地擴展或截斷文件,但這不是可移植的。
UNIX文件系統支持有效地截斷文件,並且這些命令是可移植的。缺點是寫出更多的工作。
(此外,dd
會向stderr打印一些不必要的統計信息,並且如果文件少於5行,將會退出並顯示錯誤,但在這種情況下,它將保留現有文件內容,因此行爲仍然存在如果需要,也可以解決。)
比'seek = $更簡單的方法(grep的-b^file.txt的|尾-n + 5 | -n1頭|切-d:-f1)''是尋求= $(頭-n4 file.txt的| WC -c | TR -d'「) ' – janos
使用GNU awk(v 4.1.0+,參見here)。首先,我們創建一個測試文件(注意免責聲明):
$ seq 1 10 > file # THIS WILL OVERWRITE FILE NAMED file WITH TEST DATA
然後代碼和驗證(將修改名爲file
原始文件):
$ awk -i inplace 'NR<=4' file
$ cat file
1
2
3
4
解釋:
$ awk -i inplace ' # edit is targetted to the original file (try without -i ...)
NR<=4 # output first 4 records
' file # file
你也可以在NR==5
行退出,如果你將程序的輸出重定向到一個新文件(刪除#
的行爲)會更快,是一樣的head -4 file > new_file
:
$ awk 'NR==5{exit}1' file # > new_file
測試時,先不要忘了seq
部分。
- 1. Bash刪除所有內容</html>
- 2. 刪除「?」後的所有內容python
- 3. TWIG - 刪除某些字符後的所有內容
- 4. SQL刪除了某些varchar值或word後的所有內容
- 5. 正則表達式刪除一行後的所有內容
- 6. 刪除Tcl中的字符串中的某個字符後的所有內容
- 7. 如何刪除最後一個斜槓後的所有內容?
- 8. 刪除最後一個反斜槓後的所有內容
- 9. 刪除最後一個'\'後不工作的所有內容
- 10. 刪除jQuery中的某個位置後的所有容器
- 11. Bash刪除每行之前的第一個空白的所有內容
- 12. 在BASH中,刪除兩組字符之間的所有內容
- 13. java刪除空格也刪除空格後的所有內容
- 14. 刪除文件中的所有內容
- 15. 刪除除了某個標記及其內容之外的所有內容Python
- 16. 刪除括號內的所有內容
- 17. 如何刪除字符串中某個字符後的所有內容?
- 18. 在某個點後刪除文本文件中的所有內容
- 19. 刪除所有內容
- 20. 刪除第一個字後的所有內容JS
- 21. 刪除sql第一個空白後的所有內容
- 22. 在第一個|後刪除每行中的所有內容occurence在記事本++
- 23. jquery刪除網址中的問號後的所有內容
- 24. 刪除字符串中的數字後的所有內容
- 25. 重命名Powershell中的文件刪除「_」後的所有內容
- 26. 刪除第一個/包括第一個/每行後的所有內容
- 27. 刪除除VIM中第一列以外的所有內容
- 28. 批處理文件 - 刪除所有內容的某個字符
- 29. 刪除AjaxControlToolkit ScriptManager後回發後的所有內容
- 30. 刪除身體內部和課後的所有內容
後輸入例如 – RomanPerekhrest
你的意思是輸入的例子嗎?會有有很多行的文件,名爲file.txt說了,我只想修剪一定行之後的所有文本。 – John
簡單的是'頭-4的oldfile> newfile',然後'MV newfile中oldfile'。這不是「到位」,但不知道什麼是必要的。 – cdarke