2014-02-12 3 views
3

У меня есть текст:Sed заглавной буква не работает в регулярных выражениях группы

а а Abc ABC AB_C

Я хочу, чтобы соответствовать словам с заглавными буквами и тиром (это не обязательно).

Мое решение:

[A-Z]+(_{0,1}[A-Z]+)+ 

И это работает на regexpal.com, но он не работает с sed. Что я делаю не так?

sed 's/\([A-Z]+(_{0,1}[A-Z]+)+\)/\1/g' 
+0

@Lutz это не займет AB_C – Amitesh

+0

Итак, вы ищете слова в верхнем регистре, в которых есть символ подчеркивания, а затем снова их заменять? Первая пара скобок в вашем выражении захватывает такие слова. Я не понимаю вопроса. Вы хотите только совместить такие слова или же вы хотите заменить такие слова? –

+0

@ diveshpremdeep Я использую трубку, я не показывал всей последовательности. – nervosol

ответ

4

Это регулярное выражение не поддерживается традиционным sed. Вы можете использовать grep -oP (с PCRE флагом)

s='abc abc Abc ABC AB_C' 
grep -oP '([A-Z]+(_?[A-Z]+)+)' <<< "$s" 
ABC 
AB_C 
+1

Что значит PCRE? – PsychoData

+1

'PCRE' => Perl Совместимые регулярные выражения – anubhava

+1

" plain "grep будет' grep -o '\ <[A-Z] \ + \ (_ [A-Z] * \) * \>' '. Я бы использовал '[[: upper:]]' вместо '[A-Z]' –

1

по умолчанию sed использует BRE. это означает, что вам нужно избегать символов со специальным значением, например + (.... «придавать» им особое значение.

Если вы используете gnu sed, вы можете использовать опцию -r, чтобы использовать sed ERE.

Надеюсь, это полезно.

+1

что означает BRE? – PsychoData

+1

@PsychoData Основные регулярные выражения. ERE = Extended RE – Kent

0

Вы можете сделать это с двумя способами:

  1. С фильтрации строчными буквами:

    $ echo 'abc abc Abc ABC AB_C' | sed "s/\s/\n/g" | sed '/[a-z]/d' 
    ABC 
    AB_C 
    
  2. С использованием не :

    $ echo 'abc abc Abc ABC AB_C' | sed "s/\s/\n/g" | grep "^[A-Z][A-Z_]*$" 
    ABC 
    AB_C 
    
Смежные вопросы