Sed Извлечь строку между скобками - PullRequest
3 голосов
/ 03 августа 2020

Я пытался извлечь подстроку между круглыми скобками (включая круглые скобки) из:

"WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)"

Я пробовал это:

str=$(echo $1 | sed 's/.*\(\([^)]*\)\).*/\1/');
echo $str

Я хотел получить следующее:

"(Hawaiian name—koae)"

Однако я получаю сообщение об ошибке:

bash: syntax error near unexpected token `('

Что я делаю не так?
Есть мысли? Спасибо!

Ответы [ 2 ]

1 голос
/ 03 августа 2020
echo "WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)" | \
cut -d'_' -f3 | sed s'@^ @@'

Если у вас хорошие разделители, то вырезать части строк намного проще, чем с помощью sed. Я действительно использую sed для замены символов только тогда, когда точно знаю, где они находятся. Для более сложных операций мне обычно приходится извлекать фрагмент текста из файла, вставляя символы возврата каретки до и после него с помощью ed (таким образом, помещая его в отдельную строку, которую я затем легко могу вырвать), чтобы небольшие изменения в нем, которые я хочу с помощью sed, а затем использовать ed, чтобы вернуть его.

1 голос
/ 03 августа 2020

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

sed -n 's/.*\(([^()]*)\).*/\1/p'

Здесь

  • -n - подавляет вывод строки по умолчанию
  • .*\(([^()]*)\).* - соответствует любому тексту, затем захватывает в группу 1 a (, затем 0 или более символов, кроме ( и ), затем ), а затем снова .* соответствует любому тексту до конца строки
  • /\1/ - заменяет все совпадение содержимым группы 1
  • p - выводит результат.

См. онлайн-демонстрацию

В скрипте под названием script.sh:

#!/bin/bash
str=$(echo "$1" | sed -n 's/.*\(([^()]*)\).*/\1/p');
echo "$str"

Вызывается как

bash ./script.sh "WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)"

Результат: (Hawaiian name—koae)

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