在字符串中查找文件路径

时间:2013-06-07 16:49:23

标签: regex go

我修改了gnome-terminal并添加了对自定义网址处理程序的支持:src://
它允许您在ctrl-click时直接跳转到文件中的行号。

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

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

例如

$ go build

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

我想要这样的东西

$ go build | src-links

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

我的第一个想法是使用正则表达式,但我发现的唯一例子是路径已经以scheme / prototcol为前缀。

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

2 个答案:

答案 0 :(得分:2)

很酷的主意。但文件名的格式相当一般,所以我怀疑你的目的只是为了覆盖其中很大一部分,而不是全部。

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

如果你将它与文件存在的测试结合起来(相对于当前或指定的目录),那么你有一个非常易于管理的范围和一个强大的测试。

所以你的文件规范正则表达式是这样的:

(?<![A-Za-z0-9/_.-])([A-Za-z0-9_.-]):(\d+)(?![A-Za-z0-9/_.-])

您应该能够将大多数此类文件规范转换为绝对格式,只需将它们附加到所需路径,除非它们以/开头。

$PATH/$file_path

路径是否以./开头并不重要。无论如何,上述工作,因为/foo/./bar/baz是可接受的路径。与/foo/bar/../../bar/baz/xyz'\相同。

您应该尝试确保此处使用的规范与您的gnome终端认为是链接的一部分对齐。

有关如何使用gnome终端位的详细信息将很高兴看到。这将使这个页面在将来对其他人更有用。

答案 1 :(得分:1)

除了mc0e提供的正则表达式解决方案之外,一旦找到了带有文件名的字符串,你就可以通过以下方式管理它们:

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的文件,内容为:

./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将输出:

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