我只想打印仅由a-m
和A-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
?
答案 0 :(得分:2)
在+
需要匹配之后,您没有指定任何内容。这意味着/^[a-m]+/i
匹配与/^[a-m]/i
相同的行。您需要使用行尾元字符$
指定匹配必须扩展到字符串的结尾:
perl -ne '/^[a-m]+$/i && print' /tmp/file.txt
答案 1 :(得分:1)
答案 2 :(得分:1)
另一个(可能更简单的)选项是反转逻辑并忽略包含集合之外字符的行。
perl -ne '/[^a-m]/i || print' /tmp/file.txt
将&&
切换为||
会反转逻辑,我们现在不再需要将正则表达式锚定为不匹配的字符,可以出现在字符串中的任何位置。
字符类开头的^
会反转该类。即它意味着"所有不在给定范围内的字符"。