8

Удалить фиксированный префикс/суффикс из строки в Bash

1

Заголовок: Как удалить префикс и суффикс из строки в Python?

Текст вопроса: Я хочу удалить префикс и суффикс из строки. Например, у меня есть следующая строка:

string = "hello-world"
prefix = "hell"
suffix = "ld"

Как мне получить следующий результат?

"o-wor"

Пожалуйста, подскажите, как это реализовать в Python. Буду благодарен за любой совет!

5 ответ(ов)

1

Вот перевод на русский язык в стиле ответа на 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$//

...но только потому, что:

  1. echo не беспокоится о количестве строк в своем списке аргументов, и
  2. В $prefix и $suffix нет пробелов.

В общем, хорошей практикой является помещать строки в кавычки в командной строке, потому что даже если они содержат пробелы, они будут переданы команде как один аргумент. Мы оборачиваем $prefix и $suffix в двойные кавычки по той же причине: каждая команда редактирования для sed будет передана как одна строка. Мы используем двойные кавычки, потому что они позволяют интерполяцию переменных; если бы мы использовали одинарные кавычки, в команде sed оказались бы литералы $prefix и $suffix, что, конечно, не то, что нам нужно.

Обратите внимание также на использование одинарных кавычек при установке переменных prefix и suffix. Мы определенно не хотим, чтобы что-то в строках интерпретировалось, поэтому используем одинарные кавычки, чтобы избежать интерполяции. Это может не быть необходимым в данном примере, но это очень хорошая привычка.


Надеюсь, это поможет!

0

Чтобы удалить префикс и суффикс из строки в 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", могли бы быть удалены даже в случае, если они находятся посередине строки.
0

Вы используете grep для удаления префиксов из путей (которые не обрабатываются хорошо с помощью sed):

echo "$input" | grep -oP "^$prefix\K.*"

В этой команде \K позволяет удалить из совпадения все символы перед ним. Это действительно удобный способ удалить конкретный префикс из строки, сохраняя при этом остальную часть пути.

Если у вас есть вопросы по поводу работы этого кода или вы ищете альтернативные решения, пожалуйста, дайте знать!

0

Если вам нужно обрезать строку в 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.

0

Примечание: Не уверен, было ли это возможно в 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
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь