sed не различает полное совпадение с регулярным выражением и его отсутствие

find+bashsolución:

find $folder -maxdepth 1 -type f -name "*-[0-9].jpg" -exec \
bash -c 'cp "$1" "${1:0:-4}-mini.jpg"' _ {} \;
4
06.11.2015, 15:51
2 ответа

поведение sed правильное, он распечатывает входную строку EDITED. очевидно, если во входной строке ничего не совпадает с данным токеном , результатом будет строка ввода как она есть. когда regex = "aa" оцененный токен не совпадает и распечатывает = "цветок".

0
27.01.2020, 20:50

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выводить только те биты данных, которые соответствуют заданному выражению. Опция не является стандартной -, но обычно реализуется.

0
05.02.2021, 16:48

Теги

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