【问题标题】:Regular expression, sed, path extraction正则表达式、sed、路径提取
【发布时间】:2013-06-03 09:20:13
【问题描述】:


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

程序

#!/bin/sh

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

输出

/home/用户/游戏

问题

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

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

s - 替代

. - 任意字

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

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

【问题讨论】:

  • 您应该使用 basename 仅供参考。
  • * 表示 0 或更多 + 表示 1 或更多
  • shyam > 感谢您的指正^^
  • squiguy > 感谢您的建议,我已阅读您的参考@@"
  • @squiguy 我猜你的意思是dirname,而不是basename

标签: regex sed sh


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

s 命令包含三个部分:

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

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

【讨论】:

    【解决方案2】:
    "s#\(.*\)/.*#\1#"
    

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

    \(.*\)/.*
    

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

    替换部分:

    \1
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多