Сценарий оболочки для извлечения значения из файла и сохранения его в другом - PullRequest
0 голосов
/ 18 октября 2019

У меня есть текст в одном файле, который я хочу скопировать в другой файл, используя скрипт оболочки.

Это скрипт -

#!/bin/sh

PROPERTY_FILE=/path/keyValuePairs.properties

function getValue {
   FIELD_KEY=$1
   FIELD_VALUE=`cat $PROPERTY_FILE | grep "$FIELD_KEY" | cut --complement -d'=' -f1`
}

SERVER_FILE=/path/FileToReplace.yaml

getValue "xyz.abc"
sed -i -e "s|PASSWORD|$FIELD_VALUE|g" $SERVER_FILE

keyValuePairs.properties:

xyz.abc=abs

FileToReplace.yaml:

someField:
    address: "someValue"
    password: PASSWORD

Цель сценария - извлечь «abs» из keyValuePairs.properties и заменить его в FileToReplace.yaml из поля PASSWORD. FileToReplace.yaml должен выглядеть следующим образом:

someField:
    address: "someValue"
    password: abs

Примечание. Вместо «abs» в тексте может быть знак «=». Это тоже должно работать нормально.

Текущая ситуация такова, что при запуске сценария он обновляет FileToReplace.yaml как

someField:
    address: "someValue"
    password: 

Он устанавливает значение как пустое.

Может кто-нибудь помочь мне понять, что не так с этим сценарием?

Примечание. При каждом выполнении сценария возникает проблема -

sh scriptToRun.sh 
cut: illegal option -- -
usage: cut -b list [-n] [file ...]
       cut -c list [file ...]
       cut -f list [-s] [-d delim] [file ...]

Если я использую gcut, код просто отлично работает, но я не могу использовать gcut (проблемы с требованиями). Мне нужно исправить это с помощью cut.

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Есть несколько проблем с вашим сценарием:

  1. FIELD_VALUE локально для функции getValue().
  2. getValue() будет совпадать со строками, содержащими FIELD_KEY где угоднов строке (например, some.property=string.containing.xyz.abc)
  3. getValue() может вернуть несколько строк.
  4. Будут обновлены все вхождения строки "ПАРОЛЬ" в файле сервера, а не только те, которые находятся настрока «пароль: ПАРОЛЬ».

Если вы можете использовать bash вместо sh, это должно решить все проблемы:

#!/bin/bash

declare    property_file=/path/keyValuePairs.properties
declare    server_file=/path/FileToReplace.yaml
declare    property="xyz.abc"

property_line=$(grep -m 1 "^${property}=" ${property_file}" )

sed -i 's|^\(\s*password:\s*\)PASSWORD\s$|\1'${property_line##*=}'|g' ${server_file}
0 голосов
/ 19 октября 2019

Оригинальный код, который я выложил, сработал. Я использовал неправильное имя файла в оболочке (в моем реальном коде), из-за чего он не считывал значение и, следовательно, устанавливал его пустым.

0 голосов
/ 18 октября 2019

Замените команду обрезки на:

cut -d '=' -f2-

, и она должна работать на всех версиях обрезки.

-f2- означает поле 2 и все позже. Это необходимо для обработки значений, содержащих '='.

И да, некоторые символы вызовут проблемы для команды sed. Трудно найти надежное решение без проблем здесь. Сценарий Python может быть лучшим выбором.

Если сценарий оболочки является единственным вариантом, вы можете попробовать что-то вроде этого:

(sed -n -e '1,/PASSWORD/p' FileToReplace.yaml | head -n -1;
echo "    password: ${FIELD_VALUE}";
sed -n -e '/PASSWORD/,$ p' FileToReplace.yaml) > FileToReplace.yaml.new \
&& mv FileToReplace.yaml.new FileToReplace.yaml

, но это становится довольно уродливым. (распечатайте файл до строки, содержащей «ПАРОЛЬ», затем введите полную строку пароля и напечатайте остальную часть файла)

Вы также можете использовать что-то вроде этого:

cat << EOF > FileToCreate.yaml
someField:
    address: "someValue"
    password: ${FIELD_VALUE}

если сохранение старого содержимого файла не важно.

...