В моем bash
сценарии у меня есть строка и ее префикс / суффикс. Мне нужно удалить префикс / суффикс из исходной строки.
Например, допустим, у меня есть следующие значения:
string="hello-world"
prefix="hell"
suffix="ld"
Как мне получить следующий результат?
result="o-wor"
Ответы:
источник
${${string#prefix}%suffix}
но это не работает.Используя sed:
Внутри команды sed
^
символ совпадает с текстом, начинающимся с$prefix
, а завершающий$
текст совпадает с текстом, заканчивающимся на$suffix
.Адриан Фрювирт делает несколько хороших замечаний в комментариях ниже, но
sed
для этого может быть очень полезным. Тот факт, что содержимое префикса $ и суффикса $ интерпретируется с помощью sed, может быть либо хорошим, либо плохим - если вы обращаете внимание, у вас все должно быть в порядке. Прелесть в том, что вы можете сделать что-то вроде этого:что может быть тем, что вам нужно, и одновременно и более изощренно, и мощнее, чем подстановка переменных в bash. Если вы помните, что с большой силой приходит большая ответственность (как говорит Человек-Паук), у вас все будет хорошо.
Краткое введение в sed можно найти по адресу http://evc-cit.info/cit052/sed_tutorial.html.
Примечание относительно оболочки и ее использования строк:
Для конкретного приведенного примера также будет работать следующее:
... но только потому, что:
Обычно рекомендуется заключать в кавычки строку в командной строке, поскольку, даже если она содержит пробелы, она будет представлена команде как один аргумент. Мы заключаем в кавычки префикс $ и суффикс $ по одной и той же причине: каждая команда редактирования для sed будет передаваться как одна строка. Мы используем двойные кавычки, потому что они допускают интерполяцию переменных; если бы мы использовали одинарные кавычки, команда sed получила бы литерал,
$prefix
и$suffix
это, конечно, не то, что мы хотели.Обратите внимание также на мое использование одинарных кавычек при установке переменных
prefix
иsuffix
. Мы, конечно, не хотим, чтобы что-либо в строках интерпретировалось, поэтому мы заключаем их в одинарные кавычки, чтобы не происходила интерполяция. Опять же, в этом примере это может не понадобиться, но это очень хорошая привычка.источник
$string
может быть разбито и разбито на слова. 2)$prefix
и$suffix
может содержать выражения, которыеsed
будут интерпретироваться, например, регулярные выражения или символ, используемый в качестве разделителя, который нарушит всю команду. 3) Звонитьsed
два раза не нужно (можно-e 's///' -e '///'
вместо этого), а трубку можно было бы избежать. Например, рассмотритеstring='./ *'
и / илиprefix='./'
и увидите, что это ужасно сломалось из-за1)
и2)
./
, поэтому я использовалsed "s#^$prefix##
вместо этого. (Хрупкость: имена файлов не могут содержать#
. Поскольку я контролирую файлы, мы в безопасности.)#
качестве разделителя sed означает, что вы не можете обрабатывать файлы, содержащие этот символ.Вы знаете длину своего префикса и суффикса? В твоем случае:
Или более общий:
Но решение от Адриана Фрювирта круто! Я не знал об этом!
источник
Я использую grep для удаления префиксов из путей (которые плохо обрабатываются
sed
):\K
удаляет из матча все символы перед ним.источник
grep -P
это нестандартное расширение. Больше мощности, если она поддерживается на вашей платформе, но это сомнительный совет, если ваш код должен быть достаточно переносимым.grep
. Более ранние версии фактически имели-P
опцию от BSD,grep
но они удалили ее.Ноты:
Префикс # $: добавление # гарантирует, что подстрока "ад" будет удалена, только если она найдена в начале. Суффикс% $: добавление% гарантирует, что подстрока "ld" будет удалена, только если она найдена в конце.
Без них подстроки «ад» и «ld» будут удалены везде, даже если они находятся в середине.
источник
/
сразу после строки, для чего это нужно ?Используя
=~
оператора :источник
Небольшое и универсальное решение:
источник
expr
вообще. Это была своего рода удобная утилита для кухонной мойки еще во времена оригинальной раковины Bourne, но сейчас она уже давно вышла из строя.Используя ответ @Adrian Frühwirth:
используйте это так
источник
Я хотел бы использовать группы захвата в регулярном выражении:
((?:(?!(${suffix})).)*)
гарантирует, что содержимое${suffix}
будет исключено из группы захвата. С точки зрения примера, это строка, эквивалентная[^A-Z]*
. В противном случае вы получите:источник