2013-03-18 2 views
0

Я пытаюсь выбрать только те xкак исправить это GREP заявление

舌ぽう (舌鋒x) ぜっぽう (sharp) tongue 
じょう舌 (饒x舌) じょうぜつ garrulity, loquacity 

его всегда в скобках. Поэтому я хочу, чтобы LookBehind для левой круглой скобки, то ноль или более символов, и LookAhead для ноль или более символов, за которыми следует скобка.

Я думал, что это будет работать, но это не так: (?<=\(.?)x(?=.?\))

Это один будет выделить весь текст между круглыми скобками, но я хочу только x: (?<=\().?x.?(?=\))

Я также попытался это (не уверен, что если вы можете иметь два просмотра назад ... но это не сработало:.

(?<=\()(?<=.?)x(?=.?)(?=\))

Я из идей

+0

один вопрос, являются ли эти скобки в вашем входном тексте всегда в паре? – Kent

+0

Просто небольшая точка: «ноль или больше символов» встречается '*' не '?' – Scrutinizer

+0

Whoah! Я никогда не видел, чтобы кто-нибудь пытался гречить китайцев! – bgmCoder

ответ

1

Grep не поддерживает обратные изображения переменной длины. Вы могли бы сделать что-то вроде:

# grep for x inside parenthesis 
$ grep -Po '\(.*x.*?\)' file 
(舌鋒x) 
(饒x舌) 

# pipe to grep again for just the x 
$ grep -Po '\(.*x.*?\)' file | grep -o x 
x 
x 
+0

Привет @sudo_O, я делаю это в инструменте Find/ChangeGrep Indesign, поэтому я не могу подключиться. могу ли я как-то его вложить в одно утверждение? –

+0

(удивлено, я нашел что-то, что GREP не может сделать. Думал, что он может что-то сделать!) –

+0

Я не думаю, что это возможно тогда * (у меня нет опыта с Indesign?) * –

0

не может сделать все это в одном, но может сделать это с несколькими заявлениями, один для каждого конкретного случая:

(?<=\(.)x(?=.\)) 

(?<=\(.{2})x(?=.{1}\)) 

(?<=\(.{2})x(?=.{2}\)) 

(?<=\(.{1})x(?=.{2}\)) 

(?<=\(.{3})x(?=.{1}\)) 

и т.д.

+0

можно сделать это за один короткий, если '(,)' всегда сопряжены. – Kent

+0

хорошо знать, но было бы лучше, если бы вы могли продемонстрировать! Опубликовать решение? –

+0

Я добавил для этого ответ. – Kent

1

с параметрами порядка комментарий, я предполагаю, что скобки всегда сопряжены.

Проблема заключается в том, что внешний вид требует фиксированной длины, что в этом вопросе мы не можем знать.

Но если (..) всегда в паре, мы можем просто проверить closing). Это должно дать то, что вы хотите: тест

grep -Po "x(?=[^)]*\))" file 

давайте его немного:

kent$ echo "舌ぽう (舌鋒x) ぜっぽう (sharp) tongue 
じょう舌 (饒x舌) じょうぜつ garrulity, loquacity"|grep -Po "x(?=[^)]*\))" 
x 
x 

еще один тест, я добавил y в скобках, и предположим, что мы хотим, чтобы y тоже:

kent$ echo "舌ぽう (舌y鋒x) ぜっぽう (sharp) tongue 
じょう舌 (y饒x舌) じょうぜつ garrulity, loquacity"|grep -Po "[yx](?=[^)]*\))" 
y 
x 
y 
x 

EDIT

grep -Po "x(?=[^)(]*\))" file 

это должно быть в порядке:

kent$ echo "じょうx舌 (饒x舌) じょうぜつ garrxlity, loquacity"|grep -Po "x(?=[^)(]*\))" 
x 
+0

, но он также находит x, которые находятся вне круглых скобок. –

+0

'じ ょ う x 舌 (饒 x 舌) じ ょ う ぜ つ garrxlity, loquacity' кажется, что бы найти все три' x' в этой строке, а не только x в круглых скобках –

+0

@MaxHodges см. EDIT. это должно быть хорошо для вашего нового примера. также старая команда не находит все ** три ** 'x', но первые два экземпляра. поскольку это может быть вложенные круглые скобки. но теперь я его исправил. – Kent