我不想:
$ 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
如果您想将“header”附加到“file”为什么不将“file”附加到“Header”
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