面对 Sed 命令内部正则表达式的问题

面对 Sed 命令内部正则表达式的问题

假设我运行以下命令:

export STR="abcdef.ghijkl.mnopqr.stuvwy.log"
echo $STR | sed 's/\.[^.]*$//'

我得到以下结果:

abcdef.ghijkl.mnopqr.stuvwy

我不明白上面的结果。

答案1

您的 sed 模式\.[^.]*$与原始字符串只有一个匹配:.log

细节:

  • \.仅匹配点字符。
  • [^.]匹配任何不同于.
  • [^.]*匹配任何不同于的字符序列.
  • $匹配行尾。

所以这里的决赛.log是唯一的匹配(.stuvwy.log不是匹配,因为它包含一个内部点)。sed将按照命令的要求用空字符串替换它s/\.[^.]*$//。因此你最终会得到:

abcdef.ghijkl.mnopqr.stuvwy

答案2

如果您不想使用,sed可以使用 shell 的内置模式替换。这实际上更快,不必调用外部程序。

${VAR%.*}.*将从中删除 glob 模式的匹配结尾中的字符串$VAR。请记住,它是一个 glob,而不是正则表达式,因此 a.表示字面意思“.”。

$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011

Shell 参数扩展在 BASH 手册页中了解更多信息。

答案3

s/\.[^.]*$//g== 替换以点 ( ) 开头的字符串的第一部分(因为末尾没有选项来匹配所有出现的情况) \.,后跟零个或多个*不是点 ( ) 的 ( ) 字符[^.],放置在末尾字符串 ( $),带有空字符串 ( //)。

相关内容