如何在 Linux 中查找和替换大型文件?

如何在 Linux 中查找和替换大型文件?

啊,你好;

所以我得到了这个很大的 json 文件,并且我试图查找和替换一些东西,但是当我使用 sed 时我收到一个错误,我需要一个 sed 或 awk 字符串来查找和替换它,而不会收到错误。

  • 普拉吉瓦尔

当前的:

{"telephone_numbers":["1-

未来:

{"telephone_numbers":["+1-

这是我尝试过的命令和得到的错误。

sed -i 's/{"telephone_numbers":["1-/{"telephone_numbers":["+1-/g' output.json
sed: -e expression #1, char 56: unterminated `s' command

答案1

sed你使用的命令中

s/{"telephone_numbers":["1-/{"telephone_numbers":["+1-/g

[模式中的字符集(例如[abc][a-z])。没有结束],整个逻辑就被打破了。

但你首先不需要字符集,你需要的是文字[字符。使用 对其进行转义\

严格来说,您需要转义第一个,而第二个可以转义,也可以不转义。这是因为字符集属于正则表达式。模式s/pattern/replacement/被解析为正则表达式,但替换不是。您的第二个[应该在替换中,其中未转义[并不特殊。固定命令将是:

sed -i 's/{"telephone_numbers":\["1-/{"telephone_numbers":["+1-/g' output.json

答案2

我找到了一个.go可以执行此操作的脚本。

package main

import (
        "fmt"
        "io/ioutil"
        "os"
        "path/filepath"
        "strings"
)

func visit(path string, fi os.FileInfo, err error) error {

        if err != nil {
                return err
        }

        if !!fi.IsDir() {
                return nil //
        }

        matched, err := filepath.Match("*.json", fi.Name())

        if err != nil {
                panic(err)
                return err
        }

        if matched {
                read, err := ioutil.ReadFile(path)
                if err != nil {
                        panic(err)
                }
                //fmt.Println(string(read))
                fmt.Println(path)

                newContents := strings.Replace(string(read), "1-", "+1-", -1)

                fmt.Println(newContents)

                err = ioutil.WriteFile(path, []byte(newContents), 0)
                if err != nil {
                        panic(err)
                }

        }

        return nil
}

func main() {
        err := filepath.Walk(".", visit)
        if err != nil {
                panic(err)
        }
}

然后建立文件

go build main.go

让我们运行脚本

./main

该脚本适用于几乎任何文件大小和任何文件类型。

相关内容