Это может быть больше sed
, чем вы ожидаете, но я думаю, что это лучший способ достичь того, что вы хотите с помощью sed
.
Этот скрипт:
Вставляет строку
перед каждой строкой, содержащей , если перед строкой нет других
,
или
.
Добавляет строку после каждой строки, содержащей
, если строка после строки, содержащей
, не содержит
.
Этот sed
сценарий использует sed
hold
пробел для запоминания предыдущей строки, чтобы ее можно было проверить на наличие тегов
перед вставкой тега
. Он также использует относительную адресацию ADDR,+N
, чтобы позволить добавить закрывающий тег . Специальный случай необходим для определения, если
находится на последней строке файла и требует добавления
. Для реализации логики широко используются тестирование (
t
и T
) и ветвление (b
).
#!/bin/sh
sed '
/<dt>/ {
x # exchange pattern and hold space
s/<d[tdl]>// # subsitutue, just testing for pattern
g # copy hold space back, overwriting pattern space
t end # branch to :end if previous subsitution successful
i \
<dl>
}
$ {
/<dd>/ ! b end # if <dd> on last line, append </dl>
a \
</dl>
}
/<dd>/,+1 { # on each line containing <dd> and the line after
/<dd>/ b end # if does not contain <dd>, insert </dl>
i \
</dl>
}
:end
h # copy pattern space to hold space for next round
' "$@"
Этот сценарий изменяет данные примера, чтобы они выглядели следующим образом:
[...]
# Hardware #
<dl>
<dt>RAM</dt>
<dd>2GB</dd>
</dl>
# Partitions #
<dl>
<dt>`/dev/sda1`</dt>
<dd>/boot</dd>
<dt>`/dev/sda2`</dt>
<dd>/</dd>
</dl>
Нет, ~/.bashrc
не запускает новую оболочку.
Файл инициализации ~/.bashrc
имеет источник , т. е. считывается и выполняется в той же среде, что и оболочка, которая его вызвала (, а не как скрипт ).
Оболочка, по сути, выполняет source ~/.bashrc
или . ~/.bashrc
для выполнения содержимого файла без порождения нового экземпляра оболочки.
Когда вы выполняете export variable=value
в командной строке (или variable=value; export variable
), вы устанавливаете variable
на value
и помечаете переменную как «экспортируемую», т. е. она превращается в переменную среды, которая будет быть унаследованы последующими процессами, запущенными из той же оболочки. export
не запускает новую оболочку.
Нет смысла создавать новую оболочку и .bashrc
это не скрипт, а текстовый файл. Вы можете увидеть, что происходит, когда отслеживаете PID вашей оболочки и вносите изменения в свой .bashrc
. Чтобы они вступили в силу, просто введите исходный файл:
. ~/.bashrc
Новый процесс не создается. Это как если бы вы набрали вручную все строки, включенные в этот файл. export
сам по себе не требует новой оболочки. Изменяется только среда, которая может быть унаследована в будущем.