【问题标题】:How can I add a line to a file in a shell script?如何在 shell 脚本中向文件中添加一行?
【发布时间】:2010-10-04 00:37:47
【问题描述】:

我想在现有 CSV 文件中添加一行标题,并就地编辑。我该怎么做?

echo 'one, two, three' > testfile.csv

我想结束

column1, column2, column3
one,     two,     three

我无法更改初始 CSV 输出。

任何标准命令都可以。重要的是文件编辑到位,在文件开头插入行。

【问题讨论】:

    标签: linux shell sed


    【解决方案1】:

    这不使用 sed,但使用 >> 将追加到文件。例如:

    echo 'one, two, three' >> testfile.csv
    

    编辑:要添加到文件中,请尝试以下操作:

    echo "text"|cat - yourfile > /tmp/out && mv /tmp/out yourfile
    

    我通过快速Google search 找到了这个。

    【讨论】:

    • 嗨,这会添加到文件的末尾 - 我在开头需要它 - 已经澄清了问题......
    【解决方案2】:

    sed 是基于行的,所以我不确定您为什么要使用 sed 来执行此操作。范例更多的是一次处理一行(您也可以通过编程方式找到 CSV 中的字段数并使用 awk 生成标题行)为什么不只是

    echo "c1, c2, ... " >> file
    cat testfile.csv >> file
    

    ?

    【讨论】:

      【解决方案3】:

      据我了解,您希望将 column1, column2, column3 添加到现有的 one, two, three 之前。

      我会使用ed 代替sed,因为sed 写入标准输出而不是文件中。

      命令:

      printf '0a\ncolumn1, column2, column3\n.\nw\n' | ed testfile.csv
      

      应该做的工作。

      perl -i 也值得一看。

      【讨论】:

        【解决方案4】:

        这会在文件开头添加自定义文本:

        echo 'your_custom_escaped_content' > temp_file.csv
        cat testfile.csv >> temp_file.csv
        mv temp_file.csv testfile.csv
        

        【讨论】:

        • 这对所有的 shell 语言都更通用
        【解决方案5】:

        使用 perl -i,将第 1 行的开头替换为您要插入的内容(.bk 将具有备份原始文件的效果):

        perl -i.bk -pe 's/^/column1, column2, column3\n/ if($.==1)' testfile.csv  
        

        【讨论】:

          【解决方案6】:

          要回答您最初的问题,以下是使用 sed 的方法:

          sed -i '1icolumn1, column2, column3' testfile.csv
          

          “1i”命令告诉 sed 转到第 1 行并在那里插入文本。

          -i 选项使文件被“就地”编辑,也可以使用可选参数来创建备份文件,例如

          sed -i~ '1icolumn1, column2, column3' testfile.csv
          

          会将原始文件保留在“testfile.csv~”中。

          【讨论】:

          • 哪个版本的 Unix?这不适用于经过“单一 UNIX 规范 V3”认证的 Mac OS X Leopard。
          • 我使用 Linux。显然 BSD sed(包括 OS X)需要 -i 参数(并且应该像普通参数一样分开)。尝试用“sed -i '~' ...”替换命令。如果可行,我将编辑答案。
          • 谢谢。我怀疑这一点,但后来我未能使 i 命令工作。我尝试了内联命令(不带或带-e)和脚本命令(带-f),但我得到:sed:rename():不是目录。只要对提问者有帮助,您就不需要编辑答案。
          • 很好,但我认为你应该注意“1i”部分,除非你知道 sed,否则它并不明显。
          • 我认为这应该是问题的正确答案,因为您没有复制文件或制作临时文件,如果您有一个大文件,这将起作用
          【解决方案7】:

          在两个命令的文件开头添加一个给定的行:

          cat <(echo "blablabla") input_file.txt > tmp_file.txt
          mv tmp_file.txt input_file.txt
          

          【讨论】:

            【解决方案8】:

            如何在文件中添加行

            sed -i -e "48r../../../../folder1/lines_to_add.txt" a.txt 
            

            a.txt - 你要更改的文件 48r 是 a.txt 一些的行号 行在lines_to_add.txt 文件中

            ../../../../scripts3_2d/lines_to_add.txt 
            

            -i 更新a.txt,在运行代码之前尝试不带-i,小心换行,

            "keep a newline at the end of lines_to_add.txt"
            

            【讨论】:

              猜你喜欢
              • 2020-07-12
              • 1970-01-01
              • 2011-06-26
              • 1970-01-01
              • 2022-10-17
              • 2017-11-28
              • 1970-01-01
              • 2023-02-17
              • 1970-01-01
              相关资源
              最近更新 更多