【问题标题】:Unix: prepending a file without a dummy-file?Unix:在没有虚拟文件的情况下添加文件?
【发布时间】:2010-03-23 20:12:51
【问题描述】:

我不想要:

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

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

$ cat header >> file

【问题讨论】:

  • “追加到文件开头”也称为“前置”。

标签: unix append prepend


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

          echo "`cat header file`" > file
      

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

      【讨论】:

      • 更新:这种方法似乎破坏了一些我试图在其上添加版权声明的源文件。当它在源文件中包含单引号并将转义序列转换为字符时,它似乎已经退出。我想它不是那么有用。
      • 更新 2:该命令在命令行中似乎可以正常工作,但正在解释我用来一次添加多个文件的脚本中的转义序列。起初我以为它没有使用默认的'echo -E',但仍然没有解决它。显然问题与在脚本开头使用 '#\bin\sh' 有关。从 'sh' 而不是 'bash' 命令行,转义序列一直被解释。我修改了我的脚本,使第一行改为 '#\bin\bash' 并且事情似乎正常工作。道德:sh 有问题……不知道为什么?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          感谢正确的搜索词!

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

          然后用一个文件:

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

          【讨论】:

          • 包含竞态条件;有时(如果不是总是),shell 会在第二个“cat”命令完成之前设置您的 stdout 重定向,这会将文件归零。
          • @pra:修复了吗? $ echo "$( read -t 1; cat one) \n\n $(cat two)" > one?
          【解决方案7】:

          如果你想在“文件”前面加上“标题”,为什么不把“文件”附加到“标题”

          cat file >> header
          

          【讨论】:

            【解决方案8】:

            下面是一个简单的 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
            

            【讨论】:

              猜你喜欢
              • 2012-08-23
              • 1970-01-01
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 2013-03-14
              • 1970-01-01
              • 2010-11-03
              • 2023-04-07
              相关资源
              最近更新 更多