如何修复此GREP语句

时间:2013-03-18 09:06:44

标签: adobe-indesign grep-indesign

我正在尝试只选择x

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

它总是在括号中。所以我希望LookBehind为左括号,然后是零个或多个字符,LookAhead为零或多个字符后跟括号。

我认为这样可行,但不会:(?<=\(.?)x(?=.?\))

这个会选择括号之间的所有文字,但我只想要x(?<=\().?x.?(?=\))

我也试过这个(不确定你是否可以有两个lookbehinds ......但它不起作用:

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

我没有想法。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

OP的评论

,我认为括号总是配对。

这里的问题是后视需要一个固定的长度,在这个问题中我们无法知道。

但如果(..)始终配对,我们只需检查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

修改

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

这应该没问题:

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

答案 2 :(得分:0)

不能一个一个地做,但可以用多个语句来做,每个特定情况一个:

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

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

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

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

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