Как добавить переменную в текстовый файл после определенного слова?

Вим

В vimg^Gв нижней части экрана отображается что-то вроде:

Col 1 of 3; Line 2 of 2; Word 2 of 2; Char 5 of 8; Byte 7 of 10

Чтобы байтовое смещение курсора всегда отображалось в строке состояния, добавьте %oк опции statusline:

:set statusline+=\ %o

(вам может понадобиться ввести :set laststatus=2, чтобы строка состояния всегда была видна, даже если экран не разделен. Чтобы смещение отображалось в правильном размере, поместите %oсправа от %=вstatusline).

См. также :go 123или 123go, чтобы расположить курсор ближе всего к 123 rd байту.

0
09.08.2019, 18:49
2 ответа

Использование sedи оболочки, которая знает о "здесь -строки":

$ sed '/begin/r/dev/stdin' file <<<"$variable"
mixture
  Molefraction
  begin
rn=45
fg=12
cd=6
END_OF_FILE

Это ищет строку beginв file, и когда она соответствует, вставляется все, что находится на стандартном вводе. Мы передаем значение $variableна стандартный ввод через строку -.

Для других оболочек строка здесь -тривиально заменяется на printfнад конвейером:

$ printf '%s\n' "$variable" | sed '/begin/r/dev/stdin' file
mixture
  Molefraction
  begin
rn=45
fg=12
cd=6
END_OF_FILE

Чтобы сохранить это в новый файл, используйте перенаправление в конце. Если ваш sedподдерживает редактирование места в -с помощью sed -i, это можно использовать для изменения исходного файла (, рекомендуется протестировать это на копии файла; и запуск его несколько раз добавит данные в файл несколько раз ).

Чтобы получить правильный отступ, например,.bash:

$ ( set -f; IFS=$'\n'; printf '  %s\n' $variable ) | sed  '/begin/r/dev/stdin' file
mixture
  Molefraction
  begin
  rn=45
  fg=12
  cd=6
END_OF_FILE

Здесь мы полагаемся на разбиение слов оболочки для форматирования значения переменной. Мы используем set -f, чтобы убедиться, что не происходит подстановки имен файлов, затем мы устанавливаем $IFSна новую строку,и пусть оболочка разделит значение переменной на слова с разделителями новой строки -. printfнемного изменен, чтобы вставить два пробела перед каждым словом.

5
28.01.2020, 02:14

Использованиеawk:

awk -v f="$variable" '/begin/{print; print f; next}1' input

Это будет искать строку, содержащую begin, печатать ее, затем печатать содержимое переменной, затем переходить к следующей строке. По умолчанию просто печатается любая другая строка.

Обратите внимание, :это не приведет к отступу переменной, как показано в вашем примере.


С помощью GNU awk вы можете редактировать файл на месте, используя опцию -i:

awk -iv f="$variable" '/begin/{print; print f; next}1' input

Для всех других версий awkвам потребуется создать новый файл:

awk -v f="$variable" '/begin/{print; print f; next}1' input > newfile

Затем вы можете использовать mvдля замены старого файла новым файлом, если хотите

2
28.01.2020, 02:14

Теги

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