Yuri Asked: 2018-07-27 01:32:04 +0800 CST2018-07-27 01:32:04 +0800 CST 2018-07-27 01:32:04 +0800 CST GNU grep 检查输入是否包含 LF 字符 772 我测试一组数据文件的内容,它们是否至少包含一组字符,其中包括打印字符和非打印字符。 我的最后一个问题是检测文件是否包含换行符。我的GNU grep 3.0声明每个输入都包含一个 LF……这是为什么呢? echo -n "test" | grep -UF -e $'\x0a' 有任何想法吗?我怀疑一些隐含的 EOL/EOF 干扰。 grep newlines 2 个回答 Voted Best Answer Vladimir Panteleev 2018-07-27T01:45:24+08:002018-07-27T01:45:24+08:00 grep 是面向行的 - 如果输入不以换行符结尾,它仍然将最后一个换行符(或文件开头)之后的文本视为一行。 面向行的程序不适合直接处理二进制文件——如果二进制文件的“行”特别长,它们通常会出现病态的情况。 相反,请考虑类似于trand的组合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 此方法还具有只需要读取输入直到第一个换行符(加上缓冲)的优点。 Kusalananda 2018-07-27T01:43:30+08:002018-07-27T01:43:30+08:00 从POSIX 规范grep: 正则表达式匹配应基于文本行。由于 a<newline>分隔或终止模式 [...],正则表达式不能包含 a <newline>。类似地,由于模式与输入的各个行(不包括终止<newline>字符)匹配,因此模式无法匹配<newline>输入中的 a。 要检查输入是否包含换行符,这与 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.
grep 是面向行的 - 如果输入不以换行符结尾,它仍然将最后一个换行符(或文件开头)之后的文本视为一行。
面向行的程序不适合直接处理二进制文件——如果二进制文件的“行”特别长,它们通常会出现病态的情况。
相反,请考虑类似于
tr
and的组合cmp
:此方法还具有只需要读取输入直到第一个换行符(加上缓冲)的优点。
从POSIX 规范
grep
:要检查输入是否包含换行符,这与 Unix 上的换行符相同,您可以计算行数
wc -l
:或者,如果你有一个字符串: