Назад | Перейти на главную страницу

sed + добавить номер после последнего совпадающего слова в строке

У меня есть файл журнала с именем: log.txt

моя цель - добавить параметр: $ PARAM только после последней строки: «Число» в файле log.txt

пример:

 PARAM=34.43435454

хвост -10 log.txt

   date 12.3.2010 Number 2.34
   date 12.3.2010 Number 2.14
   date 12.3.2010 Number 34.43435454

кто-нибудь знает, как это сделать с помощью sed?

После «числа» в каждой строке:

sed "s/.*Number/& $PARAM/" log.txt

После «числа» в последней строке:

sed "\$s/.*Number/& $PARAM/" log.txt

После «Цифры» последний раз он появляется в файле:

sed "/Number/!b;:a;\$!N;/\n.*Number/{h;s/\n[^\n]*\$//p;g;s/^.*\n//};\$!ba;s/^\(.*Number \)/\1$PARAM/" log.txt

Пояснение к последней версии:

  • /Number/!b - если в строке нет «Число», перейти в конец скрипта и вывести строку
  • :a - метка петли "а"
    • \$!N - если это не последняя строка файла, добавить следующую строку в конец содержимого пространства шаблонов
    • /\n.*Number/{ - если пространство шаблона включает "Число" после новой строки, тогда
      • h - копировать пространство шаблона, чтобы удерживать пространство
      • s/\n[^\n]*\$//p - удалить часть после новой строки и распечатать остаток
      • g - скопировать удерживаемое пространство в пространство шаблона
      • s/^.*\n//} - удалить часть перед новой строкой, закончить, если
  • \$!ba - ответвление с меткой "а"
  • s/^\(.*Number \)/\1$PARAM/ - добавить содержимое переменной после «Число»