我正在尝试编写一个 shell 脚本,它可以确定输入文件中的行是以 DOS (CR/LF) 还是 Unix (LF) 换行结尾。
我怎样才能做出这个决定?
最佳答案
如果检查第一行就足够了,比如
perl -ne 'exit ($_ =~ /\r$/)' file
您可以在 Bash 中做同样的事情;
lffile () {
local REPLY
read -r <"$1"
case $REPLY in *$'\r') return 1;; *) return 0;; esac
}
这需要 $'\r'
Bash >= 3.x 的 C 风格字符串。如果您可以可靠且可移植地在脚本中嵌入文字回车符,您甚至可以为此使用 sh
,只需稍作更改。下面使用讨厌的全局来保存回车符:
lffile_cr=$(printf '\r')
lffile () {
# local is not POSIX; simply overwrite REPLY
read -r <"$1"
case $REPLY in *"$lffile_cr") return 1;; *) return 0;; esac
}
在最一般的情况下,一个文件可能有混合的行尾,但如果我们假设行尾是一致的(和/或对于那个模糊的角落案例获得 50% 的命中率或未命中率是可以接受的),阅读第一行就足够了。
关于linux - 如何区分带有 DOS 换行符的文件和 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601644/