linux - 如何区分带有 DOS 换行符的文件和 shell 脚本

标签 linux shell unix

我正在尝试编写一个 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/

相关文章:

linux - shell Linux : grep exact sentence with NULL character

bash - 填充/填充 CSV 文件中缺失的列(使用制表符)

linux - 获取有关描述符的信息

linux - 使用 supervisord 优于 monit 有什么优势

linux - 列出所有 POD

linux - 转换格式 HH :MM:SS to seconds in a column with AWK

linux - bash 中的目录和文件排列

c - 为什么要在 Linux 中关闭管道?

ruby-on-rails - 将许多环境变量传递给 Unicorn 运行的 Rails 应用程序

linux - 为什么这个管道没有终止