仅打印a-m和A-M线

时间:2014-09-16 22:13:54

标签: regex perl

我只想打印仅由a-mA-M组成的行,但在下面的例子中我也得到第一行,我不应该包含{{1} }。

t

问题

如何仅打印仅包含~$ echo -e 'a t\nb\nt' > /tmp/file.txt ~$ perl -ne '/^[a-mA-M]+/ && print' /tmp/file.txt a t b ~$ a-m

的行

3 个答案:

答案 0 :(得分:2)

+需要匹配之后,您没有指定任何内容。这意味着/^[a-m]+/i匹配与/^[a-m]/i相同的行。您需要使用行尾元字符$指定匹配必须扩展到字符串的结尾:

perl -ne '/^[a-m]+$/i && print' /tmp/file.txt 

答案 1 :(得分:1)

您必须将$锚点添加到正则表达式中:

^[a-mA-M]+$

<强> Working demo

enter image description here

由于您的正则表达式为^[a-mA-M]+,因此它与文本中的a匹配,这就是为什么它会打印包含它的行:

enter image description here

答案 2 :(得分:1)

另一个(可能更简单的)选项是反转逻辑并忽略包含集合之外字符的行。

perl -ne '/[^a-m]/i || print' /tmp/file.txt

&&切换为||会反转逻辑,我们现在不再需要将正则表达式锚定为不匹配的字符,可以出现在字符串中的任何位置。

字符类开头的^会反转该类。即它意味着&#34;所有不在给定范围内的字符&#34;。