在 sed 中解码正则表达式 {m,n} 的输出时出现问题

在 sed 中解码正则表达式 {m,n} 的输出时出现问题

我创建了一个文件“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\}允许一到三位小数
  • $匹配字符串的结尾(这就是说,好吧,我不想再记录任何内容了)

与第一种情况相比,$第二种情况有所不同。

相关内容