2016-09-05 2 views
0

У меня есть набор файлов конфигурации в 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' - то есть персонажи просто двоеточие, буквенно-цифровые и пробелы.

+0

Используйте двойные кавычки '-i СЭД "с/^ UUID:. * $/$ РЕПЛ /" "$ DEST/$ е"'. В пределах одиночных кавычек переменные оболочки не расширяются. – sjsam

+1

Также 'cd $ SRC' может быть проблематичным, если' $ SRC' содержит пробелы Do 'cd" $ SRC ". Стоит попробовать [\ [shellcheck \]] (http://shellcheck.net). – sjsam

+1

В YAML нет гарантии, что значение для клавиши 'uuid' находится в одной строке. Вы должны использовать настоящий синтаксический анализатор (например, в Python, Perl или Ruby). – Anthon

ответ

1

множество проблем, связанных с этим:

cd "$SRC" # double quote to prevent word splitting 
. 
. 
repl="$(grep '^uuid' "$f")" # no spaces around =, avoid useless use of cat 
. 
. 
sed -i "s#^uuid:.*$#${repl}#" "${DEST}/${f}" 
#Double quote and use `${}` to easily detect errors 
#Use a character other than '/' as the substitution delim, I used '#' 
+0

Кажется, что '' 'after'. *' Вызвало окончательную проблему. Перейдя на ' sed -i .orig" s!^Uuid:. *! $ {Repl} !; " «$ {DEST}/$ {f}« все работало. Может быть, это '' 'нужно ускользнуть? –

Смежные вопросы