我有一个 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
成功清除了它。