Ell*_*iot 10 shell scripting newline
我有大量的源文件,最后都缺少换行符.
如何在每个换行结束时自动添加换行符?
有些可能已经有换行符,因此只应在必要时添加.
我可能不是在寻找代码本身,而只是我可以在终端中运行以添加必要的换行符(或某种编程或开发工具).
如果您可以访问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"如果文件名中包含空格,引号周围的内容仍然可以正常工作.
为方便起见,将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)
对文件末尾“缺少”换行符的文件的简单修复是简单的 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 可能需要稍微不同的语法。