啊,你好;
所以我得到了这个很大的 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
该脚本适用于几乎任何文件大小和任何文件类型。