2017-02-16 19 views
0

Я нашел хороший answer, в котором объясняется, как удалить указанный шаблон из строковой переменной. В этом случае, чтобы удалить «Foo» мы используем следующее:Удалить указанный строковый шаблон (ы) из строки в bash

string="fooSTUFF" 
string="${string#foo}" 

Однако, я хотел бы добавить «ИЛИ» функциональность, которая была бы в состоянии удалить «Foo» или «б» в тех случаях, когда моя строка начинается с любого из них и оставляет строку как есть, если она не начинается с 'foo' или 'boo'. Таким образом, модифицированный сценарий должен выглядеть примерно так:

string="fooSTUFF" 
string="${string#(foo OR boo)}" 

Как это можно правильно реализовать?

ответ

2

Вам нужно extended glob pattern для этого (включен с shopt -s extglob):

$ str1=fooSTUFF 
$ str2=booSTUFF 
$ str3=barSTUFF 
$ echo "${str1#@(foo|boo)}" 
STUFF 
$ echo "${str2#@(foo|boo)}" 
STUFF 
$ echo "${str3#@(foo|boo)}" 
barSTUFF 

@(pat1|pat2) соответствует одна из моделей, разделенных |.

@(pat1|pat2) - общее решение для вашего вопроса (несколько шаблонов); в некоторых простых случаях вы можете уйти без расширенных шаров:

echo "${str#[fb]oo}" 

будет работать и для вашего конкретного примера.

+0

Благодарим вас за обращение к руководству. Не могли бы вы расширить свой ответ на вопрос «(включен ли с помощью shopt-extglob)»? Где в скрипте он должен быть помещен? Нужно ли мне в какой-то момент отключить его? как это сделать? – Nazar

+0

@Naz Команда 'shopt -s extglob' должна быть выпущена в любой момент, прежде чем использовать шаблон' @ (...) '. Я не буду болеть, чтобы он включался, но если вы хотите явно отключить его, просто выпустите 'shopt -u extglob'. Обратите внимание, что расширенные глобы автоматически включаются для '[[$ var = pattern]]' условных чисел. Дополнительную информацию о команде 'shopt' см. В [manual] (https://www.gnu.org/software/bash/manual/bashref.html#The-Shopt-Builtin). –

3

Если установлен параметр extglob (расширенный Glob) оболочки с

shopt -s extglob 

Тогда вы можете написать:

string="${string#@(foo|boo)}" 

Расширенные шаблоны документируются в bash manual; они принимают форму:

  • ?(pattern-list): Матчи ноль или одно вхождение указанных шаблонов.

  • *(pattern-list): Соответствует нулю или более вхождений данных узоров.

  • +(pattern-list): Соответствует одному или нескольким вхождению данных узоров.

  • @(pattern-list): Соответствует одному из заданных шаблонов.

  • !(pattern-list): Совпадает ни с чем, кроме одного из данных узоров.

Во всех случаях pattern-list список шаблонов, разделенных |

+0

Спасибо за ссылки на инструкции. Не могли бы вы расширить свой ответ на вопрос «(включен ли с помощью shopt-extglob)»? Где в скрипте он должен быть помещен? Нужно ли мне в какой-то момент отключить его? как это сделать? – Nazar

+0

@Naz: Если у вас есть скрипт, вы можете поместить строку в любом месте скрипта (прежде чем использовать расширенный шаблон, конечно). Обычно вам не нужно его отключать, потому что довольно редко можно увидеть что-то похожее на расширенный шаблон, но если это мешает другому скрипту, вы можете отключить его с помощью 'shopt -u extglob' (-s: set, - u unset). Во многих дистрибутивах (например debian/ubuntu) вы обнаружите, что он включен в интерактивных оболочках, потому что он используется сценариями завершения команд. Но в неинтерактивных оболочках вам нужно включить его в скрипт. – rici

-1

Вы можете использовать:

string=$(echo $string | tr -d "foo|boo") 
+0

Это также удаляет 'foo' или' boo', когда оно не находится в начале строки. –

+0

Как и все '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – rici

+0

Да, это будет проблемой, так как мне нужно только удалить определенные шаблоны с самого начала. – Nazar

 Смежные вопросы

  • Нет связанных вопросов^_^