我创建了一个文件“numbers.txt”
1
12
123
1234
12345
123456
我正在练习 {m,n} 形式的正则表达式,它指的是“前一个字符至少出现 m 次,最多出现 n 次”。
现在当我使用
sed -n '/^[0-9]\{1,3\}/ p' numbers.txt
它显示numbers.txt 文件中的所有行。
但是,当我使用
sed -n '/^[0-9]\{1,3\}$/ p' numbers.txt
该命令仅显示那些至少具有 1 个且最多 3 个字符的行。
为什么需要加上这个“$”?根据我的理解,输入 $ 意味着我试图找到以至少 1 个、最多 3 个字符结尾的行。
另外,为什么第一个命令打印所有行?
答案1
这个正则表达式:
^[0-9]\{1,3\}
告诉 sed 寻找:
^
- 行的开头,后面是[0-9]
- 单个数字,\{1,3\}
- 重复 1 到 3 次,然后是- 任何或什么都没有
...如您所见,它与示例输入的每一行相匹配。它与前三行匹配,因为它们以一位、两位或三位数字开头。它匹配后续行,因为它们都以 3 位数字开头(并继续,但正则表达式不在乎)。
正则表达式是“贪婪的”,这意味着默认情况下,它们将尽可能多地匹配(考虑到您编码到整个正则表达式中的所有灵活性),但也是“惰性的”,因为它们不需要匹配整个正则表达式线,除非您专门用^
和将其锚定到两端$
。
假设您的意图是告诉 sed 仅打印具有以下内容的行确切地一到三位数字,那么你需要告诉正则表达式这是全部您想在整行上看到,这需要结束锚点。
答案2
揭秘第二个案例
sed -n '/^[0-9]\{1,3\}$/p' file
- 匹配
^
字符串的开头 [0-9]\{1,3\}
允许一到三位小数$
匹配字符串的结尾(这就是说,好吧,我不想再记录任何内容了)
与第一种情况相比,$
第二种情况有所不同。