我正在用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"
但是,这是两个问题
我真的不想在终端中引用“ www.yahoo.com”,因为该URL一直都在变化,所以我想要的是使用一些正则表达式在“ server”之后捕获此URL :“
如何在终端中引用Javascript变量?
我真的被困在这里,有什么帮助
答案 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