如何解决许多文件的"文件末尾没有换行符"警告?

Ell*_*iot 10 shell scripting newline

我有大量的源文件,最后都缺少换行符.

如何在每个换行结束时自动添加换行符?

有些可能已经有换行符,因此只应在必要时添加.

我可能不是在寻找代码本身,而只是我可以在终端中运行以添加必要的换行符(或某种编程或开发工具).

Nor*_*sey 7

如果您可以访问Unix工具,则可以运行diff以找出缺少换行符的文件,然后附加它:

#!/bin/sh
for i
do
  if diff /dev/null "$i" | tail -1 | grep '^\\ No newline' > /dev/null
  then 
    echo >> "$i"
  fi
done
Run Code Online (Sandbox Code Playgroud)

我依靠在第一列中diff生成带有a的消息 \,tail给我diff输出的最后一行,并grep告诉我最后一行是否是我正在寻找的消息.如果一切正常,则echo生成换行符并将其>>附加到文件中"$i"."$i"如果文件名中包含空格,引号周围的内容仍然可以正常工作.

  • 不错,但是grep会返回一个本地化的消息,比如"\ Brak znaku nowej linii(等)".此外,diff输出整个文件.我用`tail -1 $ f | grep'\n'`为条件(在我的盒子上工作). (2认同)

Tim*_*ell 6

为方便起见,将Norman的答案转换为拆分单行程.

for i in * ; do  echo $i; \
 if diff /dev/null "$i" | tail -1 | \
  grep '^\\ No newline' > /dev/null; then echo >> "$i"; \
 fi; done
Run Code Online (Sandbox Code Playgroud)

用您想要的任何文件模式替换*,例如 *.c

另一个只是告诉你哪些文件坏了:

for i in * ; do \
 if diff /dev/null "$i" | tail -1 | \
  grep '^\\ No newline' > /dev/null; then  echo $i; \
 fi; done
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要它递归,你可以将`*`与`$(find.-type f)`或`$(find <dirname> -type f -name <filepattern>)交换. (2认同)

mic*_*ael 5

对文件末尾“缺少”换行符的文件的简单修复是简单的 sed;以下修复文件“就地”(使用“-i”选项):

find . -type f -exec sed -i -e '$a\' {} \; -print 
Run Code Online (Sandbox Code Playgroud)

解释:找到所有文件 ( -type f),运行sed,就地更改文件 ( -i),给定以下 ( -e) 脚本/表达式,匹配文件末尾 ( $),并执行“追加”操作 ( a\),但不要'实际上并没有指定任何要追加的文本(在 之后没有任何内容\),这将在文件末尾添加换行符,但前提是它丢失了。打印找到的所有文件(已修复或未修复),这可能是不必要的。

主要的条件是,sed特征跨平台而异,因此-i-e可以或可以不被支持/是相同的; 例如,较旧的 Unix 或 MacOS 可能需要稍微不同的语法。

  • **警告:**不要***在 Git 存储库的根目录执行此操作,而不在“find”命令中添加“-prune”或“-not -name”以省略“.git/” ` 目录。否则,你就会破坏它。 (2认同)