【发布时间】:2010-03-23 20:12:51
【问题描述】:
我不想要:
$ cat file > dummy; $ cat header dummy > file
我想要类似于下面的命令,但要开始,而不是结束:
$ cat header >> file
【问题讨论】:
-
“追加到文件开头”也称为“前置”。
我不想要:
$ cat file > dummy; $ cat header dummy > file
我想要类似于下面的命令,但要开始,而不是结束:
$ cat header >> file
【问题讨论】:
您不能在不重写文件的情况下追加到文件的开头。您给出的第一种方法是正确的方法。
【讨论】:
如果你可以直接在命令中嵌入标题字符串,这在 sed 中很容易做到:
$ sed -i "1iheader1,header2,header3"
或者如果你真的想从文件中读取它,你可以在 bash 的帮助下这样做:
$ sed -i "1i$(<header)" file
注意“-i”用结果覆盖输入文件。如果您希望 sed 进行备份,请将其更改为“-i.bak”或类似名称,当然,始终首先使用临时目录中的示例数据进行测试,以确保在应用到真实数据之前了解将发生的情况.
【讨论】:
整个虚拟文件很烦人。这是我刚刚尝试过的 1-liner 解决方案,似乎可行。
echo "`cat header file`" > file
标记使引号内的部分首先执行,这样它就不会抱怨输出文件是输入文件。它似乎与 hhh 的解决方案有关,但有点短。我想如果文件真的很大,这可能会导致问题,因为似乎我已经看到 shell 抱怨过长时间发出命令的滴答声。首先执行的部分必须存储在缓冲区中,以便可以覆盖原始部分,但我还不足以知道该缓冲区将是什么/在哪里或它可能有多大。
【讨论】:
如果不读取文件的所有内容并使用您的前置文本 + 文件内容写入一个新文件,您就无法将其添加到文件中。将 Unix 中的文件想象为字节流 - 很容易附加到流的末尾,但没有简单的操作来“倒回”流并写入它。即使是对文件开头的查找操作也会用您写入的任何数据覆盖开头。
【讨论】:
一种可能性是使用此处的文档:
cat > "prependedfile" << ENDENDEND
prepended line(s)
`cat "file"`
ENDENDEND
这个技巧可能有内存限制。
【讨论】:
感谢正确的搜索词!
echo "include .headers.java\n$(cat fileObject.java )" > fileObject.java
然后用一个文件:
echo "$(cat .headers.java)\n\n$(cat fileObject.java )" > fileObject.java
【讨论】:
如果你想在“文件”前面加上“标题”,为什么不把“文件”附加到“标题”
cat file >> header
【讨论】:
下面是一个简单的 c-shell 尝试来解决这个问题。这个“prepend.sh”脚本有两个参数:
#!/bin/csh if (if ./tmp.txt) then rm ./tmp.txt endif cat $1 > ./tmp.txt cat $2 >> ./tmp.txt mv $2 $2.bak mv ./tmp.txt $2
【讨论】: