0

我正在尝试仅选择x

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

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

我认为这会起作用,但它没有:(?<=\(.?)x(?=.?\))

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

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

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

我没主意了。

4

3 回答 3

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
于 2013-03-18T16:19:30.317 回答
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
于 2013-03-18T09:27:22.703 回答
0

不能一次性完成所有操作,但可以使用多个语句来完成,每个特定情况都有一个:

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

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

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

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

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

ETC

于 2013-03-18T14:50:29.150 回答