7

我不想:

$ cat file > dummy; $ cat header dummy > file

我想要类似于下面的命令,但要开始,而不是结束:

$ cat header >> file
4

8 回答 8

9

您不能在不重写文件的情况下追加到文件的开头。您给出的第一种方法是正确的方法。

于 2010-03-23T20:15:01.213 回答
3

如果您可以将标题字符串直接嵌入命令中,这在 sed 中很容易做到:

$ sed -i "1iheader1,header2,header3"

或者如果你真的想从文件中读取它,你可以在 bash 的帮助下这样做:

$ sed -i "1i$(<header)" file

注意“-i”会用结果覆盖输入文件。如果您希望 sed 进行备份,请将其更改为“-i.bak”或类似名称,当然,始终首先使用临时目录中的示例数据进行测试,以确保您在应用到真实数据之前了解会发生什么.

于 2011-11-22T22:29:39.697 回答
2

整个虚拟文件的事情很烦人。这是我刚刚尝试过的 1-liner 解决方案,它似乎有效。

    echo "`cat header file`" > file

刻度使引号内的部分首先执行,这样它就不会抱怨输出文件是输入文件。它似乎与 hhh 的解决方案有关,但有点短。我想如果文件真的很大,这可能会导致问题,因为似乎我已经看到 shell 抱怨过长时间发出命令的滴答声。首先执行的部分必须存储在缓冲区中,以便可以覆盖原始部分,但我不足以知道该缓冲区将是什么/在哪里或它可能有多大。

于 2013-06-27T16:46:30.710 回答
1

如果不读取文件的所有内容并使用附加的文本 + 文件内容写入新文件,则无法将其添加到文件中。将 Unix 中的文件想象为字节流 - 很容易附加到流的末尾,但没有简单的操作来“倒回”流并写入它。即使是对文件开头的查找操作也会用您写入的任何数据覆盖开头。

于 2010-03-23T20:50:24.403 回答
1

一种可能性是使用此处的文档:

cat > "prependedfile" << ENDENDEND
prepended line(s)
`cat "file"`
ENDENDEND

此技巧可能存在内存限制。

于 2014-02-14T15:26:48.113 回答
0

感谢正确的搜索词!

echo "include .headers.java\n$(cat fileObject.java )" > fileObject.java

然后用一个文件:

echo "$(cat .headers.java)\n\n$(cat fileObject.java )" > fileObject.java
于 2010-03-23T20:47:02.473 回答
0

如果您想将“header”附加到“file”为什么不将“file”附加到“Header”

cat file >> header
于 2014-09-22T20:59:07.463 回答
0

下面是一个简单的 c-shell 尝试来解决这个问题。这个“prepend.sh”脚本有两个参数:

  • $1 - 包含预先附加的措辞的文件。
  • $2 - 要修改的原始/目标文件。
#!/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
于 2017-04-11T14:12:14.540 回答