Если я правильно понимаю ваши спецификации, это должно сделать то, что вам нужно.Данный инфиль x
,
$: last=$( grep -n delay x|tail -1|sed 's/:.*//' )
Это grep
- файл для всех строк с delay
и возвращает их с номером строки, начинающимся с двоеточия.tail -1
захватывает последнюю из этих строк, игнорируя все остальные.sed 's/:.*//'
удаляет двоеточие и фактическое содержимое строки, оставляя только число (здесь это было 14
.)
Все это оценивается, чтобы присвоить 14 как $last
.
$: sed '/delay/ { '$last'!d; '$last' s/delay/ens_delay/; }' x
alpha_notify_teta=''
alpha_notify_check='YES'
text='CRDS'
textfileooooop=''
alpha_enable='YES'
alpha_hostnames=''
alpha_orange='YES'
alpha_orange_interval='300'
alpha_notification_level='ALL'
expression='YES'
ens_delay='9'
textfileooooop=''
alpha_enable='YES'
alpha_hostnames=''
Извинения за уродливую связь.Это делает запись сценария с использованием значения $last
, чтобы результат выглядел следующим образом: sed
:
$: sed '/delay/ { 14!d; 14 s/delay/ens_delay/; }' x
sed
считывает начальные числа как селекторы строк, так что этот сценарийкоманды do -
Во-первых, sed
автоматически печатает строки, если не указано иное, поэтому по умолчанию он просто печатает каждую строку.Сценарий изменяет это.
/delay/ {
... }
- селектор записей на основе шаблона.Он будет применять команды между {}
ко всем строкам, которые соответствуют /delay/
, поэтому ему не нужен еще один grep
- он обрабатывает это сам.Внутри curly, скрипт делает две вещи.
Во-первых, 14!d
говорит (только если эта строка имеет delay
, что и будет), что если номер строки 14, не , а (!
) d
выберите запись.Поскольку все остальные строки с delay
не будут строкой 14 (или любым другим значением последней из созданных ранее команд), они получат d
выборку, которая автоматически перезапускает цикл и читает следующую запись.
Во-вторых, если номер строки равен 14, то он не будет d
elete, и, следовательно, перейдет к s/delay/ens_delay/
, который обновит ваше значение.
Длявсе строки, которые не соответствуют /delay/
, sed
, просто печатает их как есть.