向*.cpp和*.h(或任何指定的文件类型)添加换行符的bash命令?

向*.cpp和*.h(或任何指定的文件类型)添加换行符的bash命令?,bash,append,echo,newline,Bash,Append,Echo,Newline,我试着跑步 echo "\n" >> *.cpp *.h 但是我有 *.cpp: Ambiguous. 一个简单的命令就可以了,但如果它只将其添加到不以换行符结尾的非空文件中,则会增加额外的好处。这不会赢得任何美貌奖,但它至少是明确的和功能性的,并且完全符合要求(仅将换行符添加到不为空且不以换行符结尾的文件中): 说明: tail-c1“$f”输出文件中的最后一个字符(如果有) echox是一种确保保留新行的黑客手段。(从$()命令替换中删除尾随的换行符。) =~与正则表达式[

我试着跑步

echo "\n" >> *.cpp *.h
但是我有

*.cpp: Ambiguous.

一个简单的命令就可以了,但如果它只将其添加到不以换行符结尾的非空文件中,则会增加额外的好处。这不会赢得任何美貌奖,但它至少是明确的和功能性的,并且完全符合要求(仅将换行符添加到不为空且不以换行符结尾的文件中):

说明:

  • tail-c1“$f”
    输出文件中的最后一个字符(如果有)

  • echox
    是一种确保保留新行的黑客手段。(从
    $()
    命令替换中删除尾随的换行符。)

  • =~
    与正则表达式
    [^\n]x
    进行比较,即某些字符(必须有一个字符)不是紧跟
    x
    的换行符。我们需要
    $'\n'
    (巴什主义)而不是
    \n
    来匹配文字换行符

  • echo>>“$f”
    在文件末尾添加新行。(
    echo
    将打印终止换行符,除非使用了
    -n
    标志。)

更新:

下面是一个更简单的版本:

for f in *.cpp *.h; do
    if tail -c1 "$f" | egrep -q .; then
        echo >> "$f"
    fi
done

egrep
逐行匹配,因此不会与换行符匹配。因此,正则表达式
将匹配任何非换行符的字符(必须有一个字符)。(
if
在管道上检查管道中最后一个命令的退出状态--
egrep
在这种情况下。
-q
使
egrep
静音。)

如果您试图确保每个文件以换行字符结尾(而不是以单个空行结尾),然后,您可以使用GNU或BSD
sed
(Posix标准sed不必识别
-i
选项,但大多数都识别):

-n
选项禁止自动打印
-i.bak
在位编辑,保留扩展名为
.bak
的备份文件。(如果不需要备份文件,请提供空字符串作为扩展名。)

该方案:

G  append a newline and the hold buffer (which is empty)
P  print the pattern space up to the first newline.

find-iname'*.cpp'-o-iname'*.h'-exec sh-xc'echo>>“{}”\,也许吧。请注意,
“\n”
使
echo
打印两个换行符。嗯,也许可以使用
wc-l
来简化这一过程。我刚刚注意到它计算新行数。正在等待一个
sed
version.:)
sed -n -i.bak 'G;P' *.{cc,h}
G  append a newline and the hold buffer (which is empty)
P  print the pattern space up to the first newline.