如何覆盖文件中除第一行之外的所有内容?

如何覆盖文件中除第一行之外的所有内容?

我有一个 CSV 文件,我经常使用命令的输出来更新该文件,但我想保留其标头。如何防止 Bash> file.csv语法覆盖该行?

答案1

使用就地编辑而不是重定向的几个选项:

ed -s file.csv <<'EOF'
1r !some_command
1,.wq
EOF

或类似地

some_command | sed -i.bak -e '1r /dev/stdin' -e 1q file.csv

尽管 AFAIK 后者使用“幕后”临时文件。

答案2

execute command >csvfile
sed -i '1i mention the header here' csvfile

答案3

没有简单的方法可以让 shell 覆盖从偏移量开始的文件。无论如何,您都不应该就地编辑文件,因为如果编辑因崩溃或电源故障而中断,则会留下截断的文件。

创建一个新文件。首先复制第一行,然后编写其余内容。完成后,将新文件移动到位。

read -r first_line <file.csv
{
  printf '%s\n' "$first_line
  … # write the rest of the content to standard output
} >file.csv.new
mv -f file.csv.new file.csv

答案4

sed -i '2,$d'  file.csv && some_command >> file.csv

sed -i '2,$d' file.csv将删除文件中除第一行以外的所有内容。

-i告诉 sed 就地工作

2,$从第 2 行到文件末尾的地址

d执行删除操作。

您可以通过省略来尝试该命令是否执行您想要的操作-i

之后&& some_command >> file.csv将附加到文件中除非 sed成功清除了它。

相关内容