GNU grep 检查输入是否包含 LF 字符

GNU grep 检查输入是否包含 LF 字符

我测试一组数据文件的内容,它们是否包含由打印字符和非打印字符组成的一组字符中的至少一个。

我的最后一个问题是检测文件是否包含换行符。我的GNU grep 3.0声明每个输入都包含一个 LF...这是为什么?

echo -n "test" | grep -UF -e $'\x0a'

有任何想法吗?我怀疑存在一些隐式的 EOL/EOF 干扰。

答案1

grep 是面向行的 - 如果输入不以换行符结尾,它仍然将最后一个换行符(或文件开头)之后的文本视为一行。

面向行的程序不适合直接处理二进制文件 - 如果二进制文件具有特别长的“行”,它们通常会出现病态情况。

相反,考虑类似tr和的组合cmp

$ echo -n foo | tr -d -c $'\n' | cmp /dev/null - 
# no output and exits with status 0

$ echo foo | tr -d -c $'\n' | cmp /dev/null -
cmp: EOF on /dev/null which is empty
# exits with status 1

此方法还具有只需要读取输入直到第一个换行符(加上缓冲)的优点。

答案2

的 POSIX 规范grep:

正则表达式匹配应基于文本行。由于 a<newline>分隔或终止模式 [...],因此正则表达式不能包含<newline>.类似地,由于模式与输入的各个行(不包括终止字符)进行匹配<newline>,因此模式无法与<newline>输入中找到的匹配。

要检查输入是否包含换行符(与 Unix 上的换行符相同),您可以使用以下命令计算行数wc -l

lines=$( wc -l <inputfile )
if [ "$lines" -gt 0 ]; then
    echo 'Input had a linefeed character in it'
fi

或者,如果你有一个字符串:

lines=$( printf '%s' "$string" | wc -l )
# etc.

相关内容