匹配每行的第一个字符(UNIX egrep)

时间:2017-10-26 14:18:21

标签: regex macos unix grep

我希望匹配并使用egrep在UNIX终端中使用纯文本UTF-8编码文件中的每一行返回第一个字符。我假设以下带有简单RegEx的egrep命令会产生所需的结果:

egrep -o "^." FILE.txt

但是,输出似乎匹配并返回文件中的每个字符;也就是说,它的行为就像命令是:

egrep -o "." FILE.txt

使用以下命令

会发生类似的结果
egrep -o "^[a-z]" FILE.txt

即,结果就像提供了RegEx“[a-z]”一样(即,a-z范围内的每个小写ASCII字符都匹配)。

正如预期的那样,只提供一个特定字母数字字符的命令似乎返回以特定字符开头的每一行,例如,

egrep -o "^1" FILE.txt

或     egrep -o“^ T”FILE.txt

分别返回以“1”或“T”开头的所有行。

我尝试将整个文件粘贴到RegEx测试器中,例如https://regexr.com/和表达式“^”。确实表现得像预期的那样,所以我认为我的文件中没有任何可能干扰的空白字符。

使用egrep的行开头元字符“^”是否还有其他一些可能导致此问题的行为?

1 个答案:

答案 0 :(得分:1)

这是a known bug在BSD grep和GNU grep 2.5.1-FreeBSD(也讨论过here)。

-o模式下,^锚点未正确处理(报告here,已修补here):

$ echo abc | bsdgrep -o "^."
a
b
c

Linux上的GNU grep表现如预期:

$ echo abc | grep -o "^."
a

与您在此处尝试实现的内容相关(打印每个行的第一个字符),grep是一种过度杀伤力。一个简单的cut就足够了:

$ echo abc | cut -c1
a