【问题标题】:How to add lines at the beginning of either empty or not file?如何在空文件或非文件的开头添加行?
【发布时间】:2022-01-04 10:05:03
【问题描述】:

我想在文件开头添加行,它适用于:

sed -i '1s/^/#INFO\tFORMAT\tunknown\n/' file
sed -i '1s/^/##phasing=none\n/' file

但是当我的文件为空时它不起作用。我找到了这些命令:

echo > file && sed '1s/^/#INFO\tFORMAT\tunknown\n/' -i file

echo > file && sed '1s/^/##phasing=none\n/' -i file

但最后一个删除第一个(如果文件不为空)

我想知道如果文件为空,如何在文件开头添加行

我尝试使用if [ -s file ] 循环但没有成功

谢谢!

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    显式创建一个新文件,然后移动它:

    #!/bin/bash
    echo -e '#INFO\tFORMAT\tunknown' | cat - file > file.new
    mv file.new file
    

    或将文件的全部内容放入内存中:

    #!/bin/bash
    printf '#INFO\tFORMAT\tunknown\n%s' "$(<file)" > file
    

    【讨论】:

      【解决方案2】:

      ed 如果可用/可接受,这很简单。

      printf '%s\n' '0a' $'#INFO\tFORMAT\tunknown' $'##phasing=none' . ,p w | ed -s file
      

      • 如果文件不存在,它甚至会创建该文件。

      【讨论】:

        【解决方案3】:

        您可以使用插入命令 (i)。

        if [ -s file ]; then
            sed -i '1i\
        #INFO\tFORMAT\tunknown\
        ##phasing=none' file
        
        else
            printf '#INFO\tFORMAT\tunknown\n##phasing=none' > file
        fi
        

        请注意,\t for tab 不是 POSIX,并且不适用于所有 sed 实现(例如 BSD/Apple,-i 在那里的工作方式也不同)。您可以改用原始选项卡或变量:tab=$(printf '\t')。

        【讨论】:

          【解决方案4】:

          您应该在sed 中使用i 命令:

          file='inputFile'
          # insert a line break if file is empty
          [[ ! -s $file ]] && echo > "$file"
          
          sed -i.bak $'1i\
          #INFO\tFORMAT\tunknown
          ' "$file"
          

          或者你可以放弃sed,在shell中使用printf:

          { printf '#INFO\tFORMAT\tunknown\n'; cat file; } > file.new &&
          mv file.new file
          

          【讨论】:

          • 感谢您的回答,但文件为空时不起作用
          • 是的,我意识到了这一点。刚刚做了修改,请检查
          • 也许是{ echo -e 'a\nb\nc'; cat file; } | sponge file,其中海绵来自moreutils。
          【解决方案5】:

          使用普通的 bash 和 shell 实用程序:

          #!/bin/bash
          
          header=(
                  $'#INFO\tFORMAT\tunknown'
                  $'##phasing=none'
          )
          
          mv file file.bak &&
          { printf '%s\n' "${header[@]}"; cat file.bak; } > file &&
          rm file.bak
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-11
            • 2013-12-03
            • 2017-08-17
            • 1970-01-01
            • 2021-10-22
            • 1970-01-01
            • 2011-02-26
            相关资源
            最近更新 更多