LINUX.ORG.RU

Замена строки на строку со счетчиком. Изучаем bash

 


0

2

Привет.

Есть файл. В нем соотвествующий текст из чего и кого угодно с повторяющимися словами. Стоит задача найти эти слова и заменить на идентичные только со счетчиком из диапазона например 1 ... 100. Повторяющиеся слова нам ИЗВЕСТНЫ. Пример :

== текст файл ===

compareslate
comparemate
comparefate

меняем нужное нам слово compare на compare1, далее поиск, если еще находит compare то на compare2 и т.д. Sed как я понял такого не умеет делать.

Варианты на примерах ?

некрасиво, ресурсоёмко, но сработает ;)

for i in ${cat текст_файл};do
  for j in {1..100};do
    sed -i "s/$i/$i$j/" file
  done
done

bass ★★★★★
()

awk:

awk -v n=1 '{ n+= sub(/compare/, "&"n); print} ' <<EOF
compareslate
 comparemate
 comparefate ffffcompareHHH
EOF

compare1slate
 compare2mate
 compare3fate ffffcompareHHH

Если в строке надо заменять (нумеровать) все вхождения, то sub оборачивается в цикл while.

legolegs ★★★★★
()

Это наверное фича ЛОРа, когда вне зависимости от заголовка и тега — писать на чём угодно, только не на запрашиваемом. Вам на bash или на sed? Думаете почему вам тут на awk пишут? И таки да, на sed нумеровать по условию то ещё счастье...

vodz ★★★★★
()
Ответ на: комментарий от legolegs

Спасибо. Возьму на заметку. на sed заняло более времени чтобы разобраться и то не получилось нормально заработать. Частично.

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

Не буду писать что это специально, чтобы выяснить, собираешься ли ты учиться чему-нибудь. Лучше напишу ошибка, тут другие скобки $(cat текст_файл)

bass ★★★★★
()

со счетчиком из диапазона например 1 ... 100.

Каково происхождение этого условия?

Варианты на примерах?

Да, кажется, нет в Баше для такого какого-то особого сахара. Делайте в тупую:

#!/bin/bash

substring='compare'

while read -r -N 1 c; do
    printf '%s' "$c"
    case "$substring" in
        $buf$c)
            printf '%d' $((++i))
            unset buf
            ;;
        $buf$c*)
            buf+=$c
            ;;
        *)
            unset buf
            ;;
    esac
done
Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.