Shell-Script

有沒有辦法在管道命令鏈中進行“完整文件緩衝”?

  • April 14, 2016

我經常對文件進行簡單的操作,例如:

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% 的傳輸時間。

引用自:https://unix.stackexchange.com/questions/171356