Дано:
$ cat file
**Lorem ipsum dolor **sit amet, consectetur adipisicing elit. **
Ad velit delectus ** quidem itaque eum **accusamus reprehenderit**
illo culpa **** praesentium** ea fugit ****hic in vel officiis,
expedita sit **** et harum enim quaerat, **** ab corporis quo
atque perspiciatis. Minima odit obcaecati** ** reiciendis, sed
rerum ** labore. In fuga, ** aspernatur earum aliquid ** ******
**commodi delectus?
Ваша лучшая ставка - perl
или awk
:
$ perl -lpE 's/\*\*/$cnt++%2+1/ge' file
Здесь используется способность perl для вычисления выражения с подстановкой.
Метод:
- Увеличьте счетчик
$cnt++
, чтобы получить (0,1,2,3,...)
с каждой заменой в s/\*\*/$cnt++%2+1/ge
;
- Возьмите по модулю
%2
этой серии, чтобы получить (0,1,0,1,0...)
, затем добавьте 1
, чтобы получить (1,2,1,2...)
для каждой чередующейся замены.
Таким же способом вы можете использовать awk
с циклом while
:
$ awk '{while (sub(/\*\*/,cnt++%2+1))}1' file
В качестве альтернативы, вы можете slurp весь файл (с -0777
), а затем выполнить глобальную замену **[stuff between maybe on multiline]**
и заменить на 1[stuff between maybe on multiline]2
:
$ perl -0777 -lnE '$s=$_; $s=~s/\*\*([\s\S]*?)\*\*/1${1}2/g;
END{$s=~s/\*\*/1/; say $s;}' file
Обратите внимание на окончательный $s=~s/\*\*/1/;
в случае нечетного общего количества замен.
Все три футляра, отпечатки:
1Lorem ipsum dolor 2sit amet, consectetur adipisicing elit. 1
Ad velit delectus 2 quidem itaque eum 1accusamus reprehenderit2
illo culpa 12 praesentium1 ea fugit 21hic in vel officiis,
expedita sit 21 et harum enim quaerat, 21 ab corporis quo
atque perspiciatis. Minima odit obcaecati2 1 reiciendis, sed
rerum 2 labore. In fuga, 1 aspernatur earum aliquid 2 121
2commodi delectus?