У меня есть набор файлов конфигурации в YAML в одной папке и почти идентичный набор файлов в другой папке. Я пытаюсь перенести сайт, и мне нужно скопировать поле «uuid» из исходных файлов в файлы dest. «Uuid» отличается для каждого файла. Я не мог найти скрипт, чтобы сделать это, так попытался с этим:Объединить определенные поля из одного набора файлов YAML в другой
SRC=$ROOT/in
DEST=$ROOT/out
cd $SRC
for f in *
do
echo "Processing $f file..."
# Find the original UUID
repl = "$(cat $f |grep uuid)"
echo "Found UUID: $repl"
# Replace line into same file
sed -i "s/^uuid:.*$/$repl/" $DEST/$f
done
переменный $ РЕПЛ никогда не заселен, хотя я знаю, что 95% файлы имеет эту линию и работают cat FILENAME |grep uuid
матчей.
Есть ли лучший способ сделать это? И/или что я делаю неправильно?
Обновление: Спасибо @sjsam Я обновил. Однако выход все же выглядит следующим образом:
Processing views.view.who_s_online.yml file...
./merge-uuids.sh: line 11: repl: command not found
Found UUID:
sed: 1: "/Users/nic/git/cn-d8/co ...": extra characters at the end of n command
Update 2: @Anthon В моем случае uuid: ...
линия всегда первая линия (и это всегда первый ключ порядка), но не все файлы на самом деле эта строка. В любом случае не должно ли regex sed соответствовать префиксу uuid:
, где бы он ни находился в файле?
Обновление 3: Спасибо @ Антон, После фиксации пробелов около repl
Я действительно читаю значения, но sed
все еще недовольны. Выходной сигнал:
Processing views.view.who_s_online.yml file...
Found UUID: uuid: 07cc0b9d-feda-42cf-9584-cc3f640cbb41
sed: 1: "/Users/nic/git/cn-d8/co ...": extra characters at the end of n command
Нужен ли флаг необходимости для регулярного выражения или что-то в этом роде?
Обновление 4: Похоже, я сталкиваюсь с проблемой FreeBSD/OSX (см. sed extra characters at end of l command). Я попытался изменить СЕПГ строку:
sed -i .orig "s!^uuid:.*$!${repl}!;" "${DEST}/${f}"
и теперь ошибки, как:
Processing blah.yml file...
Found UUID: uuid: 5940516b-c188-4d78-8e85-cff8f746ba67
sed: 1: "s!^uuid:.*uuid: 5940516 ...": unterminated substitute in regular expression
Update 5: Я изменил строку echo "Found UUID: '${repl}'"
и выход как Found UUID: 'uuid: eff29d5a-a9fe-4430-a7e9-2a6ecb944ce0'
- то есть персонажи просто двоеточие, буквенно-цифровые и пробелы.
Используйте двойные кавычки '-i СЭД "с/^ UUID:. * $/$ РЕПЛ /" "$ DEST/$ е"'. В пределах одиночных кавычек переменные оболочки не расширяются. – sjsam
Также 'cd $ SRC' может быть проблематичным, если' $ SRC' содержит пробелы Do 'cd" $ SRC ". Стоит попробовать [\ [shellcheck \]] (http://shellcheck.net). – sjsam
В YAML нет гарантии, что значение для клавиши 'uuid' находится в одной строке. Вы должны использовать настоящий синтаксический анализатор (например, в Python, Perl или Ruby). – Anthon