正则表达式,sed,路径提取

时间:2013-06-07 06:41:27

标签: regex sed sh


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

程序

#!/bin/sh

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

输出

  

/家庭/用户/游戏

问题

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

我从网上搜索,我知道一些意思,例如:

s - 替换

. - 任何单词

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

但是我仍然不明白这段代码的含义,虽然我知道函数

2 个答案:

答案 0 :(得分:1)

 s#\(.*\)/.*#\1
  • s:substitue命令
  • #s命令的三个部分的分隔符
  • \(\):以后可以引用的组
  • .:任何角色
  • /:字面斜杠
  • .*:任意数量的字符
  • \1:referecen to first group

s命令包含三个部分:

  1. 命令s本身
  2. 要匹配的内容,包括群组的定义:\(.*\)/.*
  3. 输出什么我匹配的地方:\1
  4. 因此,这会将最后一个/的所有内容作为第一个组,并通过\1引用它来打印它。

答案 1 :(得分:1)

"s#\(.*\)/.*#\1#"

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

\(.*\)/.*

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

替换部分:

\1

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