Самый простой способ сделать это с помощью sed
- с помощью группировки команд:
{ sed '/PATTERN/!d;s///;q'; cat; } <infile
it d
удаляет все строки, которые не совпадают, при первом совпадении s
ubstitutes по вашему запросу и завершается (автоматическая печать), затем cat
берет на себя и печатает оставшиеся строки, если таковые имеются.
Не хочу сказать, что вы не можете сделать это только с sed
:
sed '/PATTERN/,$!d # delete all lines not in this range
//{ # if the line matches
x;//!{ # exchange and IF what was in hold space doesn't match
g;s///;b # get hold space content, replace, go to end of script
}
x # ELSE exchange back (do nothing)
}' <infile
Я использовал ШАБЛОН
, чтобы не усложнять (замените его на ^. * Комментарий -
или какой там шаблон).
Я предполагаю, что из вашей (закомментированной) команды sed
вы хотите, чтобы
соответствовал и заменял регулярное выражение: [1-9] [0-9]?
, что означает
[1-9]
), за которой следует [0-9]?
) , которое является довольно распространенным регулярным выражением для целых чисел от 1 до 99 (без нуля в начале).
Однако $ { параметр / шаблон / строка }
не использует регулярные выражения, он использует шаблоны расширения имени пути (также известные как подстановочные знаки).
Итак, [1-9] [0-9]?
означает
[1-9]
), за которой следует [0-9]
), за которой следует ?
) Тем не менее, это должно было работать для двузначных имен файлов, { {1}}, хотя он потребляет .
и переименуйте 10.jpg
в 46jpg
(без .
).
Что касается другой части вашего вопроса,
//
заменяет все вхождения шаблона ,
while /
заменяет только первый. Например,
$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct
Если у вас есть Perl rename
(иногда называемый prename
), вы можете сделать следующее:
rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg
Берется каждое имя файла, отделяются ведущие цифры, остальная часть имени файла и идущие следом . jpg
. Затем прибавляет 36 к числовой части, добавляет остаток исходного имени файла и заменяет суффикс на .png
.
Используйте rename -n ...
, чтобы посмотреть, что произойдет, если она ничего не изменит, или удалите -v
, чтобы она выполнялась без звука.