首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字符串中查找文件路径

在字符串中查找文件路径
EN

Stack Overflow用户
提问于 2013-06-08 00:49:23
回答 2查看 267关注 0票数 0

我修改了gnome-terminal并添加了对自定义url处理程序的支持:src://

它可以让你在ctrl-click时直接跳转到文件的行号。

示例src:///path/to/file:43

这一切都很好,但现在我需要某种类型的过滤器,将所有相对和绝对路径转换为绝对src链接。然后我就可以通过它来传输另一个程序的输出。

示例

代码语言:javascript
复制
$ go build

# command-line-arguments
./test.go:3931: undefined: erre

我想要这样的东西

代码语言:javascript
复制
$ go build | src-links

# command-line-arguments
src:///home/icholy/gocode/src/test/test.go:3931: undefined: erre

我的第一个想法是使用正则表达式,但我找到的唯一示例是已经以方案/协议为前缀的路径。

我被困住了,所以我会非常感谢你的想法/建议。我将在go中实现它,但这并不重要。

EN

回答 2

Stack Overflow用户

发布于 2013-06-08 01:33:57

很酷的主意。然而,文件名具有相当通用的格式,因此我怀疑您应该只涵盖其中的很大一部分,而不是全部。

如果您打算将其用于编程工作,那么您可能会认为只匹配许多程序员认为是良好实践的文件名是可以接受的。即路径中的字符集与A-Za-z0-9/_.-匹配。您还希望查找的是一个后跟':\d+‘的文件名,并且行规范与看起来可能是行规范一部分的其他字符不相邻。最后一点可以通过向前和向后环视断言来完成。

如果您将其与文件存在测试(相对于当前目录或指定目录)相结合,那么您就得到了一个非常易于管理的作用域和一个健壮的测试。

因此,您的文件规范正则表达式如下所示:

代码语言:javascript
复制
(?<![A-Za-z0-9/_.-])([A-Za-z0-9_.-]):(\d+)(?![A-Za-z0-9/_.-])

您应该能够将大多数这样的文件等级库转换为绝对格式,只需将它们附加到所需的路径,除非它们以/开头。

代码语言:javascript
复制
$PATH/$file_path

路径是否以./开头并不重要。因为/foo/./bar/baz是一个可接受的路径,所以上面的方法是可行的。/foo/bar/../../bar/baz/xyz'\也是如此。

您应该尝试确保您在这里使用的规范与您的gnome终端认为是链接一部分的规范一致。

如果能详细了解一下你是如何完成gnome终端部分的,那就更好了。这将使这个页面在未来对其他人更有用。

票数 2
EN

Stack Overflow用户

发布于 2013-06-08 13:45:03

除了mc0e提供的正则表达式解决方案之外,一旦您找到了带有文件名的字符串,您可以通过管道将它们传送到下面的内容:

代码语言:javascript
复制
package main

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

func checkLine(s string) bool {
    // Insert regex checking logic here. Just checking for blank line now.
    if s == "" {
        return false
    }
    return true
}

func srcerer(s string) (string, error) {
    p, err := filepath.Abs(s)
    if err != nil {
        return "", err
    }
    return "src:///" + p, nil
}

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        v := scanner.Text()
        if checkLine(v) {
            link, err := srcerer(v)
            if err != nil {
                fmt.Fprintln(os.Stderr, "Error:", err)
                return
            }
            fmt.Println(link)
        }
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }
    return
}

它将上面的代码编译成一个名为src-links的二进制文件,并给出一个名为testlines.txt的文件,其中包含以下内容:

代码语言:javascript
复制
./test.go:14: undefined: erre
./test.go:16: undefined: erre
./test.go:21: undefined: erre
./test.go:27: undefined: erre

命令cat testlines.txt | src-links将输出:

代码语言:javascript
复制
src:///home/icholy/gocode/src/test/test.go:14: undefined: erre
src:///home/icholy/gocode/src/test/test.go:16: undefined: erre
src:///home/icholy/gocode/src/test/test.go:21: undefined: erre
src:///home/icholy/gocode/src/test/test.go:27: undefined: erre
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16989204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档