【问题标题】:Matching the First Character on Each Line (UNIX egrep)匹配每行的第一个字符 (UNIX egrep)
【发布时间】:2018-04-07 23:33:57
【问题描述】:

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

egrep -o "^." FILE.txt

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

egrep -o "." FILE.txt

使用以下命令会产生类似的结果,

egrep -o "^[a-z]" FILE.txt

也就是说,结果就像提供了正则表达式“[a-z]”(即,匹配 a-z 范围内的每个小写 ASCII 字符)。

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

egrep -o "^1" FILE.txt

或 egrep -o "^T" 文件.txt

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

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

egrep 的行首元字符“^”是否存在其他可能导致此问题的行为?

【问题讨论】:

  • 这是哪个平台/grep?它在 GNU/Linux 上按预期工作。
  • 这是在 OS X 10.12.6 上。
  • 好的,我可以在 BSD grep 上重现这个。绝对出乎意料的行为,必须仔细观察。顺便说一句,要打印每行的第一个字符,您只需使用 cut -c1 file 而不是 grep。
  • 你能告诉我你的grep --version 的输出是什么吗?
  • 是:egrep (BSD grep) 2.5.1-FreeBSD

标签: regex macos unix grep


【解决方案1】:

这是 BSD 中的 a known bug 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多