Shell我可以讓
我可以讓cut
更改文件嗎?
該
man
頁面並沒有給我太多希望,但我希望它是一個未記錄的(和/或特定於 GNU 的)功能。
你不能。要麼使用 ed 或 GNU sed 或 perl,要麼做他們在幕後所做的事情,即為內容創建一個新文件。
ed
, 便攜的:ed foo <<EOF 1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/ w q EOF
GNU
sed
:sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
珀爾:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
,創建一個新文件(推薦,因為如果您的腳本被中斷,您可以再次執行它):cut -d , -f 1,3 <foo >foo.new && mv -f foo.new foo
cut
,原地替換文件(保留 的所有權和權限foo
,但需要防止中斷):cp -f foo foo.old && cut -d , -f 1,3 <foo.old >foo && rm foo.old
我建議使用其中一種
cut
基於 - 的方法。這樣你就不用依賴任何非標準的工具,你可以使用最好的工具來完成這項工作,並且你可以控制中斷的行為。
來自 ubuntu (以及debian )的moreutils包有一個名為 的程序,它也可以解決您的問題。
sponge
來自男人海綿:
海綿讀取標準輸入並將其寫入指定文件。與 shell 重定向不同,海綿在打開輸出文件之前會吸收所有輸入。這允許限制讀取和寫入同一文件的管道。
這會讓你做類似的事情:
cut -d <delim> -f <fields> somefile | sponge somefile