find
+bash
solución:
find $folder -maxdepth 1 -type f -name "*-[0-9].jpg" -exec \
bash -c 'cp "$1" "${1:0:-4}-mini.jpg"' _ {} \;
поведение sed правильное, он распечатывает входную строку EDITED. очевидно, если во входной строке ничего не совпадает с данным токеном , результатом будет строка ввода как она есть. когда regex = "aa" оцененный токен не совпадает и распечатывает = "цветок".
sed
имеет неявную команду p
, которая выполняется в конце каждого цикла. Это означает, что он будет печатать текущее содержимое "пространства шаблонов" (буфера, который содержит данные и к которому вы применяете большинство sed
команд )каждый раз, когда он подходит к концу сценария редактирования. Вы можете отключить это поведение с помощью опции -n
.
Давайте возьмем ваше описание того, что должно произойти, и превратим его в sed
команду:
I want to extract portion of a string matching a regex.
When there is no match, nothing should be returned.
sed -e '/.*\('"$regex"'\).*/!d' \
-e 's//\1/'
Первое выражение гласит: «Если строка не соответствует регулярному выражению, ее следует удалить». Когда sed
выполняет команду d
, текущий цикл завершается и немедленно читается следующая строка, если она есть. Второе выражение говорит «заменить строку битом, соответствующим группе захвата» (. Пустое регулярное выражение означает «использовать самое последнее выражение» ). sed
выполнит эту замену только в том случае, если команда d
в первом выражении не сработала.
После замены неявная команда p
в конце напечатает измененное пространство шаблонов.
Как говорили другие,это можно было бы сжать до
sed -n 's/.*\('"$regex"'\).*/\1/p'
Обратите внимание, что нет необходимости закреплять выражение.
но я, наверное, предпочел бы
grep -o -e "$regex"
или
grep -o -F -e "$regex"
если регулярное выражение на самом деле просто строка, с которой вы хотите сделать точное совпадение, как в вопросе. Я бы предпочел grep
вместо sed
, так как команда намного проще, и поэтому ее легче понять и поддерживать, а также потому, что в ней нет уязвимости внедрения кода, как в коде sed
.
Параметр -o
для grep
заставит grep
выводить только те биты данных, которые соответствуют заданному выражению. Опция не является стандартной -, но обычно реализуется.