仅当换行不存在时才添加换行符

Alw*_*Pat 33 linux bash newline sed

我想在文件末尾添加换行符,如果它不存在,这是为了防止文件末尾有多个换行符.

我希望用sed.这是我当前代码所遇到的问题:

sed -i -e '/^$/d;$G' /inputfile

echo file1
name1
name2

echo file2
name3
name4
(newline)
Run Code Online (Sandbox Code Playgroud)

当我运行我的代码到文件;

echo file1
name1
name2
(newline)

echo file2
name3
name4
Run Code Online (Sandbox Code Playgroud)

它添加了换行符,如果它没有但删除它是否存在...这让我很困惑..

Lri*_*Lri 35

SED

GNU:

sed -i '$a\' *.txt
Run Code Online (Sandbox Code Playgroud)

OS X:

sed -i '' '$a\' *.txt
Run Code Online (Sandbox Code Playgroud)

$解决了最后一行.a\是附加功能.

OS X的sed

sed -i '' -n p *.txt
Run Code Online (Sandbox Code Playgroud)

-n禁用打印并p打印图案空间.p在OS X的sed中添加了一个缺少的换行符,但在GNU sed中没有,所以这对GNU sed不起作用.

AWK

awk 1
Run Code Online (Sandbox Code Playgroud)

1可以替换为评估为true的任何内容.修改文件:

{ rm file;awk 1 >file; }<file
Run Code Online (Sandbox Code Playgroud)

庆典

[[ $(tail -c1 file) && -f file ]]&&echo ''>>file
Run Code Online (Sandbox Code Playgroud)

从命令替换的结果中删除尾随换行符,因此$(tail -c1 file)仅当file以换行符结束或为空时才为空.-f file如果file是空的则为假.[[ $x ]]等同[[ -n $x ]]于bash.


Gor*_*son 8

而不是处理整个文件,只需在最后添加换行符,只需检查最后一个字符,如果它不是换行符,则追加一个.测试换行有点有趣,因为shell通常会从字符串末尾修剪它们,所以我附加"x"来保护它:

if [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,这会将换行符附加到空文件,这可能不是您想要的.如果您想单独留下空文件,请添加另一个测试:

if [ -s "$inputfile" ] && [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi
Run Code Online (Sandbox Code Playgroud)


P.P*_*.P. 7

因为它删除了换行符,如果它不存在,你可以简单地使用:

echo "" >> file;  sed -ie '/^$/d;$G' file; sed -ie '/^$/d;$G' file
Run Code Online (Sandbox Code Playgroud)

添加换行符并删除所有内容然后添加换行符.不是优雅的方式,但肯定有效:)

  • `echo "" &gt;&gt; file;` 添加换行符;`sed -ie '/^$/d;$G' file;` 删除换行符?并再次应用相同的代码?编辑:它当然有效,但我认为必须有一个更简洁的方法..:P (2认同)