Удалить фиксированный префикс/суффикс из строки в Bash
Заголовок: Как удалить префикс и суффикс из строки в Python?
Текст вопроса: Я хочу удалить префикс и суффикс из строки. Например, у меня есть следующая строка:
string = "hello-world"
prefix = "hell"
suffix = "ld"
Как мне получить следующий результат?
"o-wor"
Пожалуйста, подскажите, как это реализовать в Python. Буду благодарен за любой совет!
5 ответ(ов)
Вот перевод на русский язык в стиле ответа на StackOverflow:
Используя sed:
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
В команде sed символ ^
соответствует тексту, начинающемуся с $prefix
, а символ $
соответствует тексту, заканчивающемуся на $suffix
.
Адриан Фрювирт поднял несколько хороших моментов в комментариях ниже, но sed
в данном случае может быть очень полезным. Факт, что содержимое $prefix
и $suffix
интерпретируется sed, может быть как хорошим, так и плохим - главное, внимательно следить за этим, и всё будет в порядке. Прекрасно то, что вы можете сделать что-то подобное:
$ prefix='^.*ll'
$ suffix='ld$'
$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//"
o-wor
Это может быть тем, что вам нужно, и это и более изящно, и более мощно, чем подстановка переменных в bash. Если вы помните, что с великой силой приходит великая ответственность (как говорит Спайдермен), у вас всё будет хорошо.
Быстрое введение в sed можно найти по адресу: http://evc-cit.info/cit052/sed_tutorial.html
Замечание по поводу оболочки и работы со строками:
Для данного конкретного примера также подойдет следующий вариант:
$ echo $string | sed -e s/^$prefix// -e s/$suffix$//
...но только потому, что:
echo
не беспокоится о количестве строк в своем списке аргументов, и- В
$prefix
и$suffix
нет пробелов.
В общем, хорошей практикой является помещать строки в кавычки в командной строке, потому что даже если они содержат пробелы, они будут переданы команде как один аргумент. Мы оборачиваем $prefix
и $suffix
в двойные кавычки по той же причине: каждая команда редактирования для sed будет передана как одна строка. Мы используем двойные кавычки, потому что они позволяют интерполяцию переменных; если бы мы использовали одинарные кавычки, в команде sed оказались бы литералы $prefix
и $suffix
, что, конечно, не то, что нам нужно.
Обратите внимание также на использование одинарных кавычек при установке переменных prefix
и suffix
. Мы определенно не хотим, чтобы что-то в строках интерпретировалось, поэтому используем одинарные кавычки, чтобы избежать интерполяции. Это может не быть необходимым в данном примере, но это очень хорошая привычка.
Надеюсь, это поможет!
Чтобы удалить префикс и суффикс из строки в bash, можно использовать операции подстановки. Вот пример, в котором мы удаляем "hell" из строки "hello-world", если "hell" находится в начале, и "ld" из "o-world", если "ld" находится в конце:
string="hello-world"
prefix="hell"
suffix="ld"
# Удаляем "hell" из "hello-world", если он найден в начале.
prefix_removed_string=${string/#$prefix}
# Удаляем "ld" из "o-world", если он найден в конце.
suffix_removed_string=${prefix_removed_string/%$suffix}
echo $suffix_removed_string
В результате выполнения данного скрипта выведется o-wor
.
Обратите внимание:
- При использовании
#
перед переменной, проверяется наличие префикса. Это значит, что "hell" будет удалён только если он находится в начале строки. - Аналогично,
%
используется для проверки суффикса, и "ld" будет удалён только если он находится в конце строки. - Если бы этих символов не было, такие подстроки, как "hell" и "ld", могли бы быть удалены даже в случае, если они находятся посередине строки.
Вы используете grep
для удаления префиксов из путей (которые не обрабатываются хорошо с помощью sed
):
echo "$input" | grep -oP "^$prefix\K.*"
В этой команде \K
позволяет удалить из совпадения все символы перед ним. Это действительно удобный способ удалить конкретный префикс из строки, сохраняя при этом остальную часть пути.
Если у вас есть вопросы по поводу работы этого кода или вы ищете альтернативные решения, пожалуйста, дайте знать!
Если вам нужно обрезать строку в bash, отрезав префикс и суффикс, вы можете использовать следующую команду с expr
:
expr "$string" : "$prefix\(.*\)$suffix"
Этот подход универсален и помогает извлечь нужную часть строки. Вот как это работает:
$string
— это ваша исходная строка.$prefix
— это префикс, который вы хотите удалить.$suffix
— это суффикс, который вы также хотите удалить.\(.*\)
— соответствует любой последовательности символов между префиксом и суффиксом, и именно эта часть и будет возвращена.
Пример использования:
string="hello_world_example"
prefix="hello_"
suffix="_example"
result=$(expr "$string" : "$prefix\(.*\)$suffix")
echo "$result" # выведет: world
Эта команда эффективна и не требует дополнительных зависимостей, что делает её подходящей для различных сценариев работы с текстом в bash.
Примечание: Не уверен, было ли это возможно в 2013 году, но это точно возможно сегодня (10 октября 2021 года), поэтому добавляю еще один вариант...
Мы имеем дело с известными строками фиксированной длины (prefix
и suffix
), и можем использовать подстроку в bash
, чтобы получить желаемый результат за одну операцию.
Входные данные:
string="hello-world"
prefix="hell"
suffix="ld"
План:
- Синтаксис подстроки в
bash
:${string:<start>:<length>}
- Пропуская
prefix="hell"
, наше<start>
будет равно4
<length>
будет равен общей длине строки (${#string}
) минус длины фиксированных строк (4
дляhell
и2
дляld
)
Это даст нам:
$ echo "${string:4:(${#string}-4-2)}"
o-wor
Примечание: Скобки можно убрать и все равно получить тот же результат.
Если значения prefix
и suffix
неизвестны или могут варьироваться, мы можем использовать ту же операцию, но заменить 4
и 2
на ${#prefix}
и ${#suffix}
, соответственно:
$ echo "${string:${#prefix}:${#string}-${#prefix}-${#suffix}}"
o-wor
Как выполнить рекурсивный поиск/замену строки с помощью awk или sed?
Извлечение имени файла и расширения в Bash
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Создание переменной временной метки в bash-скрипте