read, err := ioutil.ReadFile(path)
if err != nil {
return err
}
if strings.Contains(string(read), "STRING") {
// display line number?
// what if many occurrences of the string
// how to display for each the line number?
}
我试图搜索文件中的特定字符串,并显示字符串所在的行号。
答案 0 :(得分:16)
使用scanner逐行迭代文件,增加每个循环的行数。
e.g。
f, err := os.Open(path)
if err != nil {
return 0, err
}
defer f.Close()
// Splits on newlines by default.
scanner := bufio.NewScanner(f)
line := 1
// https://golang.org/pkg/bufio/#Scanner.Scan
for scanner.Scan() {
if strings.Contains(scanner.Text(), "yourstring") {
return line, nil
}
line++
}
if err := scanner.Err(); err != nil {
// Handle the error
}
更新:如果您需要在“数千个文件”中执行此操作(根据另一个答案的注释),那么您可以将此方法包装在worker pool中并同时运行。
答案 1 :(得分:2)
嗨试试这个。
/* ioutil.ReadFile returns []byte, error */
data, err := ioutil.ReadFile("output.txt")
/* ... omitted error check..and please add ... */
/* find index of newline */
file := string(data)
line := 0
/* func Split(s, sep string) []string */
temp := strings.Split(file, "\n")
for _, item := range temp {
fmt.Println("[",line,"]\t",item)
line++
}
基本上,它将使用ioutil包读取文件并从内容中找出换行符。当您找到某个字符或换行符等时,字符串包非常有用。请查看GO的官方网页,以获取进一步的说明和示例。 (https://golang.org/pkg/strings/#Split)。
我从上面的(https://golang.org/pkg/strings/#Split)做了一个“output.txt”,预期的输出应该是
[ 0 ]
[ 1 ] Examples
[ 2 ]
[ 3 ] Contains
[ 4 ] ContainsAny
[ 5 ] Count
[ 6 ] EqualFold
[ 7 ] Fields
[ 8 ] FieldsFunc
[ 9 ] HasPrefix
[ 10 ] HasSuffix
...
关于格式,您可以修改
{fm.Printf fmt.Println("[",line,"]\t",item)
(
答案 2 :(得分:1)
首先按行分割文件(可以使用strings.Split
或bytes.Split
完成),然后遍历这些行并分别检查每行是否包含所需的字符串。如果是,则打印行号。