2015-06-16 2 views
2

В сценариях bash, какой эффективный способ сделать следующее, пожалуйста?Как удалить символы до и с подчеркиванием?

var="fooo_barrrr" 

Что это лучший способ, чтобы удалить все символы до и включая «_», так что переменная становится «barrrr» пожалуйста?

+1

Что делать, если у вас есть несколько '_'? Какую часть строки вы хотите сохранить? – fedorqui

ответ

5

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

$ var="fooo_barrrr" 
$ echo ${var#*_} 
barrrr 

Чтобы изменить саму вар, var=${var#*_}.

ПримечаниеЭтот удаляет до первого _:

$ var="fooo_barrr_r" 
$ echo ${var#*_} 
barrr_r 

Если вы хотите удалить до последнего, вам нужно будет использовать ## вместо:

$ var="fooo_barrr_r" 
$ echo ${var##*_} 
r 

См некоторые альтернативы:

С sed:

$ sed 's/^[^_]*_//' <<< "foo_barrrr_r" 
barrrr_r 

С awk:

$ awk 'gsub(/^[^_]*_/,"")1' <<< "foo_barrrr_r" 
barrrr_r 

С grep:

$ grep -oP '[^_]*_\K.*' <<< "foo_barrrr_r" 
barrrr_r 

Во всех случаях, чтобы сохранить новое значение в той же вар, сделать var=$(command <<< "$var").

+0

'$ {var ## * _}' удаляет до последнего – 123

+0

Да! Я использую просто '#', потому что понимаю, что это только первый вопрос. Тем не менее, я редактирую, чтобы указать это. Спасибо – fedorqui

+0

Вы также можете использовать 'expr '$ var": "[^ _] * _ \ (. * \)" ', Если вы создаете исчерпывающий список :) – 123

1

Или, используя grep:

echo fooo_barrrr | grep -oP '.*(?=_)' 

Чтобы понять значение каждого флага используйте grep --help:

  • -P, --perl-регулярное_выражение

    PATTERN является Perl регулярное выражение

  • -o, --only синхронизма

    показывают только часть согласования линии PATTERN

Для того, чтобы избежать неправильных результатов при наличии более чем двух частей, вы можете использовать:

echo fooo_barrrr_xyz | grep -oP '.*?(?=_)' | head -1 
+1

Обратите внимание, что это не выполняется для 'echo fooo_barrrr_ca | grep -oP '. * (? = _)' ' – fedorqui

+0

Действительно. Я предположил, что у ОП есть только две части. Ред. – Maroun

+0

Как это считать «эффективным», учитывая, что есть встроенная оболочка? –

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