如何使用Bash命令在Java变量中查找和替换文件

时间:2019-04-18 17:05:45

标签: javascript sed terminal

我正在用Javascript编写一些代码,并且定义了几个称为

的变量
const url = "www.google.com"
const data = "xyz"

我还有一个文本文件,如下所示:

clusters:
- cluster:
    server: www.yahoo.com
    certificate-authority-data: abc
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws

我要做的就是用我定义的变量替换“服务器”名称和“证书授权数据”,看起来像“

clusters:
- cluster:
    server: www.google.com
    certificate-authority-data: xyz
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws

我知道要使用

sed -i "s%www.yahoo.com%www.google.com%g" "test.txt"

但是,这是两个问题

  1. 我真的不想在终端中引用“ www.yahoo.com”,因为该URL一直都在变化,所以我想要的是使用一些正则表达式在“ server”之后捕获此URL :“

  2. 如何在终端中引用Javascript变量?

我真的被困在这里,有什么帮助

2 个答案:

答案 0 :(得分:1)

如果确实需要,有一种方法可以使nodejs执行bash命令。 NodeJS Shell Commands。在这种情况下,它可能看起来像这样:

const replaceUrl = "www.yahoo.com";
const url = "www.google.com";
const data = "xyz";
child_process.execSync('sed -i "s%' + replaceUrl + '%' + url + '%g" "test.txt"').toString();

为了方便起见,我在这里使用了同步版本,但是异步版本可以与回调一起使用。该函数返回一个缓冲区,因此.toString()可以理解所有数据,但是在您的情况下,不应有任何返回。

答案 1 :(得分:0)

如果js文件为a,则文本文件为b
尝试两次,每次更换一对。 2行,然后在shell中输入enter,每行2个进程链接为1

$ sed -En 's!^.*\burl\s*=\s*"([^"].+)"\s*!s/\\b(server:\\s*).+/\\1\1/i!;te;b;:e p;q' a |sed -i -Ef - b

$ sed -En 's!^.*\bdata\s*=\s*"([^"]+)"\s*!s/\\b(certificate-authority-data:\\s*).+/\\1\1/i!;te;b;:e p;q' a |sed -i -Ef - b

注意:首先通过在第二次使用-i opt来测试它。 sed -i -E..成为sed -E...

一行gnu awk

awk 'FNR==NR {if(/(const\s)?url\s*=/) {u=gensub(/.*url.*"([^"]+)"/,"\\1",1)} else if(/(const\s)?data\s*=/) {v=gensub(/.*data.*"([^"]+)"/,"\\1",1)} next} {if(/server:/) print gensub(/(.*server:\s*).*/,"\\1"u,1); else if (/certificate\S+:/) print gensub(/(.*certificate-authority-data:\s*).*/,"\\1"v,1); else print }' a b