Shell

我可以讓cut更改文件嗎?

  • June 27, 2019

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

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