Bash заменить строку в файле многострочным файлом - PullRequest
1 голос
/ 07 января 2020

У меня есть текстовый файл, который имеет некоторые значения заполнителя:

Пример:

Parent:
   Child: x
   Child2: <place-holder>

Car:
   Seat: x
   Door: <place-holder>

Я выполняю это с помощью sed таким образом, который работает как на MacOS, так и на Linux

sed -i .bak "s/<place-holder>/$REPLACEMNET_VALUE/g" file.yml

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

У меня есть файл с несколькими строками в правильном формате и расположение этого файла в переменной среды.

sed -i .bak "s/<place-holder-section>/$(<$CONFIG_OPTIONS_TEMP)/g" config.yml

Однако sed, похоже, не может обрабатывать несколько строк ( без экранирования).

Ошибка:

sed: 1: "s/<place-holder-section>/ f ...": unescaped newline inside substitute pattern

Возможно, это можно решить с помощью некоторого зацикливания и подстановки позиции строки, но я надеюсь, что у кого-то есть более элегантное решение, возможно, используя awk? Сохранение кросс-совместимости MacOS также является проблемой.

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Sed имеет другую команду 'r filename' "добавить текст, прочитанный из имени файла". Поэтому, если весь текст, который нужно вставить, находится в отдельном файле, вы можете использовать эту команду sed.

Пример:

bjb@blueeyes:~$ cat /tmp/old
Parent:
  Child: x
  Child2: <place-holder>

Car:
  Seat: x
  Door: <place-holder2>


<foo>


bjb@blueeyes:~$ cat /tmp/new
CarSeat:
    padding: fluff
    belt:  seat-belt-stuff

bjb@blueeyes:~$ sed '/<foo>/ {
> x
> r /tmp/new
> }' /tmp/old
Parent:
  Child: x
  Child2: <place-holder>

Car:
  Seat: x
  Door: <place-holder2>



CarSeat:
    padding: fluff
    belt:  seat-belt-stuff



bjb@blueeyes:~$ 

Команда sed адресована маркеру в файле / tmp / old - она ​​помещает эту строку в пространство удержания и никогда не извлекает ее, поэтому заменяет маркер содержимым файла /tmp/new.

0 голосов
/ 07 января 2020

Это может работать для вас (GNU sed):

sed -e '/<foo>/{r insertFile' -e 'd}' file

При обнаружении строки, содержащей <foo>, заменить ее содержимым insertFile.

NB. Решение состоит в том, из двух частей: r insertFile обычно должен заканчиваться символом новой строки, но опция -e может эмулировать это, поэтому вторая часть также вводится с другой опцией -e, которая удаляет найденную строку. d также должен быть последней командой, поскольку любые другие команды, следующие за ней, никогда не будут выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...