2014-02-07 4 views
4

Я хочу совместить символы, отличные от квадратных скобок, в регулярном выражении.Как избежать квадратных скобок внутри скобок в grep

именно я хочу, чтобы соответствовать некоторые специальные символы и некоторые другие не делают, поэтому я хочу, чтобы указать им

# grep $'[^a-zA-Z0-9#\\/:!<>{},=?.()["_+;*\'&|$-]' file 

Это не хватает ], я попытался убежать с \], \\] и так далее, Я читал, что люди делают это внешнее [^], но мне нужно это внутри!

ответ

8

Поместите ] сразу после ^.

Вот пример. Входной файл "Foo" содержит:

foo 
[ 
bar 
] 
baz 
quux 

Мы выполняем команду:

grep '[^][]' foo 

Выход есть:

foo 
bar 
baz 
quux 

Из документации на bracket expressions in POSIX regular expressions:

правая скобка (']') потеряет свое особое g и представить себя в выражении скобки, если оно встречается сначала в списке (после начального обводки ('^'), если оно есть).

, а также: ''

специальные символы '*', '[' и '\' (период, звездочка, левый кронштейн, и обратный, соответственно) теряет их особое значение в выражении скобки.

+1

Ваше выражение верное, но вашего объяснения нет. Большинство реализаций регулярных выражений не распознают '\\' как escape-символ в наборах, поэтому вы должны помещать ']' где-то там, где он не является частью синтаксиса, - непосредственно за '' '' или '' [^'. –

+0

@GuntramBlohm Вы правы. Забавно, как мои пальцы знали, что делать лучше, чем мой мозг в тот момент. Я исправил объяснение. –

+0

Да, это сработало, но почему так нужно? Есть спецификация? –

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