Использование sed для редактирования строк в файле с переменной

Мне нужно редактировать строки в файле с помощью sed . Теперь проблема в том, что я заменяю конкретный шаблон комбинацией текста и числа. Это число является переменной, которая продолжает увеличиваться для каждой последующей строки. Теперь, когда sed выполняет команду для всех строк за один раз, она заменяет шаблон, найденный текстом и фиксированным номером (т.е. начальное значение числа).

Например:

  • Вставка текста между двумя шаблонами
  • Я пытаюсь найти файлы и печатать ТОЛЬКО размер этих файлов
  • Обработка текста и экспорт содержимого на лист Excel
  • Сделать awk использовать bash с помощью команды system ()
  • Журналы ошибок потока
  • Почему sed действует по-разному в зависимости от выходного файла?
  •  k = 10 sed "s/raj/ram${k++}/" 

  • Как удалить все числа, окруженные <>
  • Как сравнить два файла в зависимости от значения первого столбца?
  • Как преобразовать * текст * в {\ i текст} с sed?
  • Возвращайте только часть строки после соответствующего шаблона
  • Добавить строку, используя Sed на удаленной системе
  • Легкий способ разбора формата даты syslog
  • 3 Solutions collect form web for “Использование sed для редактирования строк в файле с переменной”

    Если ваш файл довольно маленький, это может сработать:

     #!/bin/bash for n in {1..40} do sed -i $n's/raj/ram'$n'/' file done 

    Он выполняет итерацию по файлу 40 раз и всегда заменяет только одну строку. Если вы хотите увеличить счетчик не по номеру строки, а по количеству строк, которые вы изменили, вы должны сделать это по-другому, с двумя переменными, но sed-команда будет схожа – n не будет устанавливаться в цикле ,

    sed -i изменяет файл на месте, поэтому, если вы хотите сохранить оригинал, сначала нужно сделать копию.

    Это можно сделать в oneliner, если вы предпочитаете:

     for n in {1..40}; do sed -i $n's/raj/ram '$n'/' file ; done 

    Возможно также выбор правильного размера вместо 40 автоматически.

     awk -vn=10 '{sub(/raj/, "ram" n); print; n++}' 

    Бывают случаи использования sed , и есть время, чтобы не использовать его.
    Поскольку у sed нет встроенной арифметики, просто используйте что-то еще.
    Вы можете взломать sed, чтобы сделать это (без петли), но это довольно бессмысленно и просто грязный kludge по сравнению с использованием чего-то более подходящего.

    С помощью этих входных данных:

     printf '%s\n' 'a.raj' 'yyy' 'zzz' 'b.raj c.raj' >file num=10 # start with this value 

    Вот метод perl, который увеличивает каждое и каждое появление raj (не только один раз для каждой строки)

     perl -pe 'BEGIN{ $num='$((num-1))' } s/raj/ram.($num+=1)/ge' file 

    вывод:

     a.ram10 yyy zzz b.ram11 c.ram12 

    Вот еще одна версия perl , которая увеличивает raj только один раз за соответствие строки (т. Е. Несколько совпадений в одной строке имеют одинаковый числовой суффикс).

     perl -pe 'BEGIN{ $num='$num' } if(/raj/){ s/raj/ram.$num/ge; $num+=1 }' file 

    вывод:

     a.ram10 yyy zzz b.ram11 c.ram11 

    см.: Когда я НЕ должен использовать sed

    Linux и Unix - лучшая ОС в мире.