У меня есть файл с символом, который я хотел бы заменить, но я также хочу, чтобы каждый экземпляр символа (ов), который должен быть заменен, повторялся с номером внутри замены жала.
SomeFile.txt
[H
A
[H
B
[H
C
Я хочу заменить «[H» на «</pre></div><div id=cat$n><pre>
», где $ n - интегратор для числа замен. Таким образом, первая замена будет 1, 2, 3, 4, n ++ и так далее.
Есть ли способ сделать это с sed
?
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
. 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
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
.