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