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

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

Например:

 k = 10 sed "s/raj/ram${k++}/" 

  • Форматировать вывод на определенную длину строки
  • Как я могу разделить строку на две строки, если длина больше 7 с помощью awk?
  • Почему sed так быстро?
  • Параллелизация sed дает разную производительность
  • Как удалить новые строки из ip в качестве вывода?
  • Как добавить некоторую строку в соответствие с предыдущей строкой, сопоставленной с sed?
  • Найдите строку и добавьте ее в конец файла.
  • Как сбить имя файла с помощью SED
  • 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 - лучшая ОС в мире.