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

В моем сценарии bash меня есть строка и ее префикс / суффикс. Мне нужно удалить префикс / суффикс из исходной строки.

Например, допустим, что у меня есть следующие значения:

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

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

 result="o-wor" 

 $ foo=${string#"$prefix"} $ foo=${foo%"$suffix"} $ echo "${foo}" o-wor 

Использование sed:

 $ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//" o-wor 

В команде sed символ ^ соответствует тексту, начинающемуся с $prefix , и завершающий $ match текст, заканчивающийся $suffix .

Adrian Frühwirth делает несколько замечательных замечаний в комментариях ниже, но sed для этой цели может быть очень полезен. Тот факт, что содержимое префикса $ и $ суффикса интерпретируется 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 -es/^$prefix// -es/$suffix$// 

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

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

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

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

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

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

\K удаляет из совпадения все символы перед ним.

Знаете ли вы длину вашего префикса и суффикса? В твоем случае:

 result=$(echo $string | cut -c5- | rev | cut -c3- | rev) 

Или более общий:

 result=$(echo $string | cut -c$((${#prefix}+1))- | rev | cut -c$((${#suffix}+1))- | rev) 

Но решение от Adrian Frühwirth – это круто! Я не знал об этом!

Малое и универсальное решение:

 expr "$string" : "$prefix\(.*\)$suffix" 

Используя @Adrian Frühwirth ответ:

 function strip { local STRING=${1#$"$2"} echo ${STRING%$"$2"} } 

используйте его так

 HELLO=":hello:" HELLO=$(strip "$HELLO" ":") echo $HELLO # hello 

Используя оператор =~ :

 $ string="hello-world" $ prefix="hell" $ suffix="ld" $ [[ $string =~ $prefix(.*)$suffix ]] && echo "${BASH_REMATCH[1]}" o-wor 
  • отменить порядок символов в строке
  • Параллелизировать скрипт Bash с максимальным количеством процессов
  • Остановить первую ошибку
  • Найти и заменить имя файла рекурсивно в каталоге
  • Bash расширяет переменную переменной
  • Могут ли выражения расширения параметра $ {var} быть вложенными в bash?
  • эхо, который выводит на stderr
  • grep для выражения, содержащего переменную
  • Как передать символ asterisk '*' в bash в качестве аргументов моей программе на C?
  • Область переменной Bash
  • Каково ключевое слово 'function', используемое в некоторых сценариях bash?
  • Давайте будем гением компьютера.