Bash - подстановочный параметр в родительском совпадении (SED / AWK)
325
ds2000
Я работаю над небольшим скриптом, чтобы взять некоторые переменные, packageName, newVersion. Я погуглил и попробовал очень много, и это заставляет меня спрашивать.
В файле YAML содержится около 50 пакетов, поэтому я не могу просто с сожалением сказать о sed / version / newVersion. Система также довольно заблокирована, поэтому добавить в ОС парсер yaml может быть сложно.
Какие-нибудь советы?
Спасибо
Дейв
Может быть, вопрос очевиден для вас, но вы должны добавить больше деталей. Что именно вы пытаетесь достичь? Я принимаю то, что вы опубликовали, за оригинальный файл, если это так, то, пожалуйста, опубликуйте файл так, как вы хотите, чтобы он был изменен с помощью `sed` или` awk`. Также опубликуйте команды, которые вы использовали, чтобы другие могли предложить, как их исправить.
simlev 7 лет назад
0
Спасибо за ответ. Я обновил исходный вопрос, чтобы, надеюсь, он стал немного понятнее :)
ds2000 7 лет назад
0
2 ответа на вопрос
0
ds2000
Наконец-то мне это удалось с помощью Perl. Я надеюсь, что это помогает кому-то еще:
Я вижу, вы поняли это с perl. Вот что я бы предложил:
perl -lape "if (/'weblogic-pkg-1':/../localpath:/ and /versionidentifier|localpath:/) {\$a = \$1 if /\s+versionidentifier: '(.+)'/;s/\$a/2.0.1-B3/}" input.txt
Если вы хотите обернуть его в скрипт Bash:
#!/usr/bin/env bash while getopts ":p:v:" opt; do case $opt in p) p="$OPTARG" ;; v) v="$OPTARG" ;; \?) echo "Invalid option -$OPTARG" >&2 ;; esac done perl -lape "if (/'$p':/../localpath:/ and /versionidentifier|localpath:/) {\$a = \$1 if /\s+versionidentifier: '(.+)'/;s/\$a/$v/}" input.txt
Примечание: я не включил этот -iпереключатель, потому что он опасен: вы должны сначала поэкспериментировать и настроить скрипт под свои нужды, а только потом заменить perl -i -laneвместо perl -lane.