【发布时间】:2021-08-11 13:06:35
【问题描述】:
我是正则表达式的新手,我正在尝试从文本文件中查找仅以 S 开头的姓氏,后跟逗号,然后是空格,然后是不以 S 开头的名字。 我在 MacBook 上使用终端。
这是我的正则表达式
^[S\w][,]?[' ']?[A-RT-Z]?
我的全部命令
猫人.txt | grep -E ^[S\w][,]?[' ']?[A-RT-Z]?
名字是第二个单词,姓氏是每行的第一个单词。
我得到的结果:
施密特,保罗
出售,西蒙
史密斯,彼得
斯蒂芬斯,希拉
我期望得到什么
施密特,保罗
史密斯,彼得
【问题讨论】:
-
您使用的是
grep或awk或sed或perl或python或ed还是别的什么?如果是grep,grep有哪些选项?最好显示您正在使用的命令行。字符类中重复的单引号名义上是不相关的(字符类[aba]与[ab]相同)。但是单引号(和双引号)在 shell 中很重要。\w表示法在 PCRE(Perl 兼容的正则表达式)中具有特殊含义,但在其他地方没有。 -
我正在使用 grep。这是我的完整命令:: cat People.txt | grep -E ^[S\w][,]?[' ']?[A-RT-Z]?
-
请查看UUoC — Useless Use of
cat— 并使用grep -E '…regex…' People.txt处理文件。请注意,我的大纲将整个正则表达式括在单引号中——强烈建议这样做,因为它可以防止不必要的 shell 扩展/元字符处理。然后,您将不需要空间周围的内部单引号。您不需要逗号周围的字符类(尽管它不会造成重大伤害)。如所写,您的正则表达式会查找以S或w开头的行(shell 会为您删除反斜杠)。 -
您在问题中编辑的命令行与您的评论中显示的命令行不匹配。它们中的任何一个都准确吗?
-
@JonathanLeffler 实际上它工作得很好。感谢您提供给我的链接,这对我很有帮助。 cmets 中的那个是我将编辑我的问题的准确的那个。