0


这是一个关于正则表达式的问题。
我有以下代码:

程序

#!/bin/sh

temp="/home/user/game/log.txt"
echo $temp | sed -e "s#\(.*\)/.*#\1#"

输出

/home/用户/游戏

问题

这家伙是什么意思—— s#\(.*\)/.*#\1#

我从网上搜索,我知道一些含义,例如:

s- 代替

.- 任何单词

*- 前面的单词可以重复0到无限次

但是我还是不明白这段代码的意思,虽然我知道函数

4

2 回答 2

1
 s#\(.*\)/.*#\1
  • s: 替换命令
  • #s:命令具有的三个部分的分隔符
  • \(\): 以后可以引用的组
  • .: 任意字符
  • /: 字面斜线
  • .*: 任意数量的字符
  • \1: 参考第一组

s命令包含三个部分:

  1. 命令s本身
  2. 匹配什么,包括组的定义:\(.*\)/.*
  3. 在匹配的地方输出什么:\1

因此,这会将最后/的所有内容作为第一组,并通过引用它来打印它\1

于 2013-06-07T06:47:30.557 回答
1
"s#\(.*\)/.*#\1#"

s是替代命令,其格式为s[DELIM]regex[DELIM]replace[DELIM]. 和 DELIM 可以是分隔参数的任何字符。在您的情况下,分隔符是#. 在正则表达式部分你有:

\(.*\)/.*

\(这里捕获和之间的匹配),这意味着您可以在命令的替换部分引用它。在捕获中,您 [贪婪] 匹配任何内容。但是这个匹配必须在某个地方停止,因为在捕获之后有一个/应该匹配的斜线。由于捕获.*是贪婪的,sed 将匹配并捕获直到最后一个斜线。然后,它将匹配.*而不捕获。这部分不会包含任何斜线(由于之前的贪婪匹配)。因此,如果正则表达式包含斜杠,它将匹配所有输入,但它也会记住该部分,直到最后一个斜杠。

替换部分:

\1

用捕获的部分替换匹配的模式。总而言之,此命令匹配某个目录中的文件,并将删除文件名,只留下目录名。

于 2013-06-07T06:52:17.773 回答