Как добавить текст для значения в паре ключ-значение в текстовом файле, который имеет много таких пар

init - это /bin/bash

Как я уже говорил на https://unix.stackexchange.com/a/197472/5132, init=/bin/sh не монтирует файловые системы "API", аварийно завершается без промывки кэша при наборе exit (https://unix.stackexchange.com/a/195978/5132), и вообще оставляет за (супер)пользователем право вручную выполнять действия, которые делают систему минимально пригодной для использования.

Одним из таких действий (если вы хотите использовать оболочку управления заданиями, как вы, очевидно, делаете) является приобретение управляющего терминала. /dev/tty - это не настоящее терминальное устройство. Это устройство, которое перенаправляет на любой управляющий терминал открывающегося процесса. Если у него нет терминала, как не было у процесса №1 в начале (и обычно все время, когда реальная программа системного менеджера выполняется как процесс №1), то открытие устройства не удается.

Ваша система слишком минимальна. Вам нужно запустить программу, которая устанавливает управляющий терминал, инициализирует правильный сеанс и, возможно, выполняет некоторые минимальные действия по управлению системой, такие как правильное и чистое выключение, а затем запускает оболочку управления работой.

Дальнейшее чтение

5
29.06.2018, 15:21
3 ответа

Есть несколько способов; напр. сsed:

sed -i 's/^RELEASESTATUS=.*/&xyz/' keyvalue.txt

Это ищет строки, начинающиеся с RELEASESTATUS=, совпадающие с полной строкой (благодаря .*), и заменяет эти строки содержимым строки (&), за которой следует xyz.

9
27.01.2020, 20:31

Аналогичен ответу Стивена , но немного отличается по способу исполнения:

sed -i '/^RELEASESTATUS=/s/$/xyz/' keyvalue.txt

Вместо того, чтобы заменять всю строку своей копией с некоторым текстом, добавленным в конец, сначала находит правильную строку (строку, которая имеет RELEASESTATUS=в самом начале ), а затем заменяет в необходимый текст в конце этой строки.

Здесь используется тот факт, что общая форма подстановочной команды(ssedтакова:

start,end s/pattern/replacement/flags

где startи endзадают диапазон строк, к которым должна быть применена команда, в виде начального и конечного адреса (, а «адрес» может быть номером строки, регулярным выражением или смещением ). При использовании одного адреса команда применяется только к этой строке (или к отдельным строкам, соответствующим определенному регулярному выражению ).

7
27.01.2020, 20:31

Вы также можете попробоватьawk:

awk 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt

И если у вас есть GNU awk 4.1.0или более поздняя версия, вы можете сделать это на месте:

gawk -i inplace -v INPLACE_SUFFIX=.bak 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt
2
27.01.2020, 20:31

Теги

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