Замена строки с помощью итератора

У меня есть файл с символом, который я хотел бы заменить, но я также хочу, чтобы каждый экземпляр символа (ов), который должен быть заменен, повторялся с номером внутри замены жала.

SomeFile.txt

[H
A
[H
B
[H
C

Я хочу заменить «[H» на «</pre></div><div id=cat$n><pre>», где $ n - интегратор для числа замен. Таким образом, первая замена будет 1, 2, 3, 4, n ++ и так далее.

Есть ли способ сделать это с sed?

2
задан 7 April 2016 в 15:18

3 ответа

Perl к спасению!

perl -pe 'BEGIN { $n = 1 } s%\[H%</pre></div><div id=cat$n><pre>% && $n++' filename
  • -p чтения вход линию за линией и печать вообще код делает с ним
  • BEGIN { ... }, выполняется, прежде чем программа вводится
  • s%pattern%replacement% замены pattern с replacement.
  • \[ потребности обратная косая черта, потому что [ является особенным в регулярных выражениях
  • && $n++, Если замена успешна, она возвращает true, таким образом, следующая команда выполняется: и это увеличивает счетчик $n.
5
ответ дан 8 April 2016 в 01:18
  • 1
    Я просто проверил, и это верно, Ubuntu 14.04 не использует ни одного init или systemd, но это использует Выскочку, которую не рассматривают в моем курсе. – Asarluhi 16 August 2017 в 03:44

AWK версия. Заметьте как [ оставлен и как кавычки организованы для разрешения counter переменная для расширения в "</pre></div><div id=cat"counter"><pre>" :

$ awk '{ if ( $0~/\[H/ ){\                                                     
>    counter++; sub(/\[H/,"</pre></div><div id=cat"counter"><pre>")\           
> }; print }' test_input.txt                                                   
</pre></div><div id=cat1><pre>
A
</pre></div><div id=cat2><pre>
B
</pre></div><div id=cat3><pre>
C
</pre></div><div id=cat4><pre>

Если Вы не используете gawk, использовать gawk '...' input_file.txt > /tmp/tmp.txt && mv /tmp/tmp.txt input_file.txt приблизьтесь для замены исходного файла отредактированной версией

Дополнение

Как muru предположили, код может быть упрощен до

awk '/\[H/{counter++; sub(/\[H/,"</pre></div><div id=cat"counter"><pre>")}1' test_input.txt
2
ответ дан 8 April 2016 в 01:18
  • 1
    Я don' t думают 11n_disable=8, полезно для 7 260. Это для более старых. Но я не совсем уверен. – Pilot6 16 August 2017 в 04:49

Другой awk путь, рассматривая [H как разделитель записей:

awk -v RS='\\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1'

Все кроме первой записи будут иметь [H перед ним, таким образом, для этих записей я распечатаю </pre></div><div id=catN><pre>, где N = NR - 1 (NR являющийся рекордным числом) перед самой записью.

$ awk -v RS='\\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1' foo.txt

</pre></div><div id=cat1><pre>
A

</pre></div><div id=cat2><pre>
B

</pre></div><div id=cat3><pre>
C

С GNU awk, можно использовать новый оперативный модуль модификации:

gawk -i inplace  -v RS='\\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1' foo.txt

Это подобно sed -i.

4
ответ дан 8 April 2016 в 01:18
  • 1
    Да, я также обновил ответ для обращения к вопросу о файлах. – Ravexina 16 August 2017 в 03:48

Другие вопросы по тегам:

Похожие вопросы: