这是关于正则表达式的问题 我有以下代码:
#!/bin/sh
temp="/home/user/game/log.txt"
echo $temp | sed -e "s#\(.*\)/.*#\1#"
/家庭/用户/游戏
这个家伙是什么意思--- s#\(.*\)/.*#\1#
?
我从网上搜索,我知道一些意思,例如:
s
- 替换
.
- 任何单词
*
- 前面的单词可以重复0到无限次
但是我仍然不明白这段代码的含义,虽然我知道函数
答案 0 :(得分:1)
s#\(.*\)/.*#\1
s
:substitue命令#
:s
命令的三个部分的分隔符\(\)
:以后可以引用的组.
:任何角色/
:字面斜杠.*
:任意数量的字符\1
:referecen to first group s
命令包含三个部分:
s
本身\(.*\)/.*
\1
因此,这会将最后一个/
的所有内容作为第一个组,并通过\1
引用它来打印它。
答案 1 :(得分:1)
"s#\(.*\)/.*#\1#"
s
是替换命令,其格式类似于s[DELIM]regex[DELIM]replace[DELIM]
。和DELIM可以是任何分隔参数的字符。在您的情况下,分隔符为#
。在正则表达式部分,你有:
\(.*\)/.*
此处捕获\(
和)
之间的匹配,这意味着您可以在命令的替换部分中引用它。在捕获内部,你[贪心]匹配任何东西。但是这场比赛必须在某个地方停止,因为在捕获之后有一个斜线/
应该匹配。由于捕获的.*
是贪婪的,因此sed将匹配并捕获,直到最后一个斜杠。然后,它将匹配.*
而不捕获。此部分不包含任何斜杠(由于之前的贪婪匹配)。因此,正则表达式将匹配所有输入(如果它包含斜杠),但它也将记住该部分直到最后一个斜杠。
替换部分:
\1
将匹配的模式替换为捕获的部分。总而言之,此命令匹配某些目录中的文件,并将删除文件名,只留下目录名。