假设我运行以下命令:
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
== 替换以点 ( ) 开头的字符串的第一部分(因为末尾没有选项来匹配所有出现的情况) \.
,后跟零个或多个*
不是点 ( ) 的 ( ) 字符[^.]
,放置在末尾字符串 ( $
),带有空字符串 ( //
)。