Alw*_*Pat 33 linux bash newline sed
我想在文件末尾添加换行符,如果它不存在,这是为了防止文件末尾有多个换行符.
我希望用sed.这是我当前代码所遇到的问题:
sed -i -e '/^$/d;$G' /inputfile
echo file1
name1
name2
echo file2
name3
name4
(newline)
当我运行我的代码到文件;
echo file1
name1
name2
(newline)
echo file2
name3
name4
它添加了换行符,如果它没有但删除它是否存在...这让我很困惑..
Lri*_*Lri 35
GNU:
sed -i '$a\' *.txt
OS X:
sed -i '' '$a\' *.txt
$解决了最后一行.a\是附加功能.
sed -i '' -n p *.txt
-n禁用打印并p打印图案空间.p在OS X的sed中添加了一个缺少的换行符,但在GNU sed中没有,所以这对GNU sed不起作用.
awk 1
1可以替换为评估为true的任何内容.修改文件:
{ rm file;awk 1 >file; }<file
[[ $(tail -c1 file) && -f file ]]&&echo ''>>file
从命令替换的结果中删除尾随换行符,因此$(tail -c1 file)仅当file以换行符结束或为空时才为空.-f file如果file是空的则为假.[[ $x ]]等同[[ -n $x ]]于bash.
而不是处理整个文件,只需在最后添加换行符,只需检查最后一个字符,如果它不是换行符,则追加一个.测试换行有点有趣,因为shell通常会从字符串末尾修剪它们,所以我附加"x"来保护它:
if [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi
请注意,这会将换行符附加到空文件,这可能不是您想要的.如果您想单独留下空文件,请添加另一个测试:
if [ -s "$inputfile" ] && [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi
因为它删除了换行符,如果它不存在,你可以简单地使用:
echo "" >> file;  sed -ie '/^$/d;$G' file; sed -ie '/^$/d;$G' file
添加换行符并删除所有内容然后添加换行符.不是优雅的方式,但肯定有效:)