Используйте sed для замены строки в диапазоне с помощью многострочного -диапазона текста

Основная проблема, которую необходимо решить, — конфликты имен программ.

Наличие большого PATHбольше не проблема, так как в оболочке Bourne есть хеш для расположения двоичных путей, т.е. 1977.

Необычно иметь символические ссылки, за исключением одной причины:

To be able to have an own selection of programs that differs from the cluster view.

Если вы, например. установите PATH на:

PATH=/usr/gnu/bin:/usr/bin

вы найдете все инструменты GNU перед стандартными системными инструментами.

Это может позволить вам легко использовать инструменты GNU, но это также приводит к необходимости, например,. использовать GNU chmod, в котором отсутствует поддержка ACL, и использовать GNU tar, который известен тем, что создает архивы с проблемами переносимости.

Предположим, что вы в основном заинтересованы в GNU xgettext, но в остальном предпочитаете использовать официальные системные инструменты, которые включают поддержку расширенных системных функций, о которых инструменты GNU не знают. Это можно сделать, создав собственный каталог bin, например. вызов:

mkdir ~/bin

Если вы затем создадите символическую ссылку:

cd ~/bin
ln -s /usr/gnu/bin/xgettext

и установите этот ПУТЬ:

PATH=~/bin:/usr/bin:/usr/gnu/bin

вы получите GNU xgettext, если вы позвоните xgettext, но официальные системные инструменты, если вы позвоните, например. chmodили tar. Поскольку обычно есть символические ссылки на инструменты GNU, но с их собственным префиксом в /usr/bin/(, например. с /usr/bin/gtarпо/usr/gnu/bin/tar)вы по-прежнему можете намеренно использовать GNU tar, вызвав gtar.

Кстати,:/opt/binне является частью стандарта UNIX FHS, и в этом стандарте перечислены

/opt/<vendor>/bin

, а не

/opt/<project>/bin

хотя есть примеры и последнего.

0
25.08.2020, 22:47
2 ответа

Если бы только этот текстовый файл был в формате json.

Затем мы могли бы прочитать файл, скажем, в python, превратить его в объект, а затем вы могли бы просто сказать:

object.repo1.image.tag="newest1";
object.repo2.image.tag="newest2";

, а затем преобразуйте его в строку и запишите обратно в файл. Тогда было бы легче читать, писать и поддерживать. Но поскольку файл пока застрял в текстовом файле, давайте сделаем это трудным путем.

cat thefile | sed '/repo1:/, /tag/ s/tag:\slatest/tag: newest1/g' | sed -e '/repo2:/,$ s/tag:\slatest/tag: newest2/g';

На самом деле это три части. Сначала мы просто загружаем файл в поток.

Затем мы получаем первый паттерн, поэтому действуем на все строки между паттернами /repo1 :/ и /tag/. И в этих строках мы заменяем /tag :\slatest/ на /tag :newest/.

Затем мы снова делаем то же самое, за исключением repo2. С repo2 он смешался с repo2 в разделе глобальных переменных в верхней части файла. Он совпал в глобальной части, а затем перешел к первому тегу и подумал, что это и есть желаемый шаблон.

Я обошёл это, сказав, что диапазон до -равен $. То есть до конца файла.

Я не мог понять, как указать новые строки в диапазонах слов в sed. Тогда я мог бы сопоставить /\nrepo2/. Что указывало бы только на последний repo2, как и текущее решение.

С диапазоном $ текущее решение начнет делать избыточные замены, если файл станет длиннее и начнет содержать больше экземпляров /tag :last/.

0
18.03.2021, 23:09

Используя python, способ редактирования этого файла состоит в том, чтобы импортировать модуль yaml, а затем загрузить файл yaml в словарь python, также известный как hash | ассоциативный массив, хотя и вложенный.

Затем мы переходим к настройке значений ключей в файле yaml.

Наконец, мы сохраняем словарь обратно в файл yaml.

Код sed предназначен для вставки пустых строк в узлы верхнего уровня, если файл yaml.

$ yaml_file='values.yaml'

$ python3 - "$yaml_file" <<\YAML
import sys, yaml

yaml_doc = sys.argv[1]

with open(yaml_doc) as fp:
  h = yaml.safe_load(fp)

h['repo1']['image']['tag'] = 'newest1'
h['repo2']['image']['tag'] = 'newest2'

with open(yaml_doc, 'w') as fp:
  yaml.safe_dump(h, fp, default_flow_style=False)
YAML

$ sed -Ei -e '1!{/^\S/{H;z;x;};}' "$yaml_file" 
0
18.03.2021, 23:09

Теги

Похожие вопросы