如何在空文件或非文件的开头添加行?

How to add lines at the beginning of either empty or not file?

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

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 ] 的循环但没有成功

谢谢!

您应该在 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

您可以使用插入命令(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 不是 POSIX,并且不适用于所有 sed 实现(例如,BSD/Apple、-i 的工作方式也不同)。您可以改用原始制表符或变量:tab=$(printf '\t').

明确创建一个新文件,然后移动它:

#!/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

使用普通 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

如果 available/acceptable.

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

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