我可以让“cut”就地更改文件吗?

我可以让“cut”就地更改文件吗?

man没有给我太多希望,但我希望它是一个未记录的(和/或 GNU 特定的)功能。

答案1

更多实用程序来自 ubuntu 的软件包(以及德比安)有一个名为 的程序sponge,它也可以解决您的问题。

来自海绵男:

Sponge 读取标准输入并将其写入指定文件。与 shell 重定向不同,sponge 在打开输出文件之前吸收所有输入。这允许限制读取和写入同一文件的管道。

这会让你做类似的事情:

cut -d <delim> -f <fields> somefile | sponge somefile

答案2

你不能。要么使用 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。这样您就不需要依赖任何非标准工具,您可以使用适合工作的最佳工具,并且可以控制中断时的行为。

答案3

我认为单独使用是不可能的cut。我在手册或信息页面中找不到它。你可以做一些事情,比如

mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file

mktemp使您成为一个相对安全的临时文件,您可以将cut输出通过管道传输到其中。

答案4

您可以将 slurp 与 POSIX Awk 一起使用:

cut -b1 file | awk 'BEGIN{RS="";getline<"-";print>ARGV[1]}' file

例子

相关内容