Shell-Script
有沒有辦法在管道命令鏈中進行“完整文件緩衝”?
我經常對文件進行簡單的操作,例如:
cat file1.txt|sed -r 's/^ *//'
刪除行首的空格。如果我想覆蓋文件,我知道的唯一方法是:
cat file1.txt|sed -r 's/^ *//' > file2.txt mv file2.txt file1.txt
這很煩人,因為我必須檢查 file2.txt 是否存在,因為我必須編寫兩個命令而不是一個,等等。
所以我想:有沒有辦法在管道命令鏈中進行完整的文件緩衝?所以我可以寫:
cat file1.txt| magicbuffercommand |sed -r 's/^ *//' > file1.txt
該命令應該緩衝(當然,直到最大字節)並等待 EOF,然後應該開始寫入標準輸出。
有什麼可以做這樣的事情嗎?
你不需要
cat
.sed
愉快地接受文件名作為參數:sed 's/^ *//' <file>
如果您使用 GNU sed,您可以使用
-i
或--in-place
開關來編輯文件:sed -i 's/^ *//' <file>
sponge
要回答這個問題,您可以使用moreutils 包中的工具實現“完整文件緩衝” 。使用sponge
您可以執行以下操作:<command> <file> | sponge <file> # or <command1> < <file> | <command2> | sponge <file>
使用您的
sed
範例,這將變為:sed 's/^ *//' <file> | sponge <file>
你看過 Linux 緩衝區命令嗎?這利用使用者共享記憶體段基本上允許並發讀/寫。我想如果共享記憶體段足夠大,它可以緩衝整個文件。
buffer 命令可能不會自動安裝,但我在不同 Linux 發行版的許多儲存庫中找到了該程序。更糟糕的是,您可以穀歌並找到原始碼並自己編譯/連結。
我使用緩衝區來加快寫入速度較慢的設備(如磁帶驅動器)的速度,它確實減少了大約 10-20% 的傳輸時間。