Как найти и заменить внутри файла некоторую переменную Javascript с помощью команды Bash - PullRequest
0 голосов
/ 18 апреля 2019

Я пишу некоторый код в 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

Все, что я хочу сделать, это заменить имя «sever» и «data-authority-data» на определенные мной переменные, которые выглядят как «

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 постоянно меняетсяя хочу использовать некоторое регулярное выражение для захвата этого URL после "server:"

  2. как я могу ссылаться на переменную Javascript в терминале?

Я действительно застрял здесь, любая помощь

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Существует метод получения nodejs для выполнения команды bash, если это действительно необходимо. Команды оболочки NodeJS . В этом случае это может выглядеть примерно так:

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() должен иметь смысл для любых данных, но в вашем случае возвращаться не должно.

0 голосов
/ 19 апреля 2019

, если файл js a, текстовый файл b
попробуйте gnu sed дважды, каждый для одной пары замены, т.е. 2 строки, сопровождаемые вводом в оболочке, каждая - 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 на 2nd т.е. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...