Как заменить последнее вхождение шаблона в третьей последней строке файла

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

$ mycommand dir-[0-9][0-9][0-9]/myfile

При базовой подстановке вам нужен один шаблон для однозначных чисел, один для двузначных чисел и т. д.

$ mycommand dir-[0-9]/myfile dir-[0-9][0-9]/myfile

Zsh (но не другие оболочки) также поддерживает mycommand dir-<->/myfile или, например, mycommand dir-<3-42>/myfile для каталогов с номерами от 3 до 42.

Или, если вы предпочитаете раскрытие фигурных скобок (и ваша оболочка поддерживает это):

$ mycommand dir-{1..3}/myfile

Если ваши имена каталогов содержат начальные нули, поместите их в фигурные скобки, например каталог-{001..048}/мой файл.

С раскрытием фигурных скобок вы также можете сделать (в ksh93 и zsh, но не в bash)

$ mycommand dir-{1..$n}/myfile

где $n расширяется до некоторого целого числа.

0
05.09.2017, 19:49
2 ответа

С sed:

tac file | sed '3 s|<br />$|</font>|' | tac

С ed:

echo -e '$-2s/<br \/>$/<\/font>/\nw' | ed -s file

С vim:

:$-2 s!<br />$!</font>!
8
28.01.2020, 02:13

Поскольку это последнее вхождение в файл, вы можете использовать этот sedскрипт:

sed -i 'H;1h;$!d;g;s_\(.*\)<br />_\1</font>_' yourfile.html

или упрощенный с помощью GNU sedи расширенного регулярного выражения:

sed -izE 's_(.*)<br />_\1</font>_' yourfile.html

Хитрость заключается в том, чтобы обработать весь файл в одном буфере. Версия POSIX делает это путем сбора в буфере удержания, версия GNU использует для этого опцию -z. Затем с помощью команды sзамените все (.*), включая последнее вхождение шаблона, на все перед шаблоном (, \1относится к части в())и замене.

Другая попытка, если вам действительно требуется замена только в третьей до последней строке (без замены, если нет совпадения, без замены в следующей -по -последней или последней строке):

sed '1N;N;$!{P;D];s_<br />_</font>_' yourfile.html
0
28.01.2020, 02:13

Теги

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