Unix:在没有虚拟文件的情况下添加文件?

时间:2010-03-23 20:12:52

标签: unix append prepend

我不想要:

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

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

$ cat header >> file

8 个答案:

答案 0 :(得分:10)

如果不重写文件,则无法附加到文件的开头。你给出的第一种方法是正确的方法。

答案 1 :(得分:3)

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

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

或者,如果您真的想从文件中读取它,可以使用bash的帮助来完成:

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

请注意,&#34; -i&#34; 用结果覆盖输入文件。如果您想要sed进行备份,请将其更改为&#34; -i.bak&#34;或类似的,当然总是首先测试临时目录中的样本数据,以确保您了解在应用真实数据之前会发生什么。

答案 2 :(得分:2)

整个虚拟文件很烦人。这是我尝试过的单线解决方案,似乎有效。

    echo "`cat header file`" > file

勾选使引号内的部分首先执行,这样它就不会抱怨输出文件是输入文件。这似乎与hhh的解决方案有关,但有点短。我想如果文件非常大,这可能会导致问题,因为看起来好像我已经看到shell抱怨嘀嗒声制作命令的时间太长了。在某处,首先执行的部分必须存储在缓冲区中,以便原始文件可以被覆盖,但我不足以知道缓冲区的内容/位置或者可能有多大。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

一种可能性是使用here-document:

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

这个技巧可能存在内存限制。

答案 5 :(得分:0)

感谢正确的搜索结果!

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

然后使用文件:

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

答案 6 :(得分:0)

如果你想预先挂起&#34;标题&#34;到&#34;文件&#34;为什么不追加&#34;文件&#34;到&#34;标题&#34;

cat file >> header

答案 7 :(得分:0)

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

  • $ 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