我正在尝试只选择x
舌ぽう (舌鋒x) ぜっぽう (sharp) tongue
じょう舌 (饒x舌) じょうぜつ garrulity, loquacity
它总是在括号中。所以我希望LookBehind为左括号,然后是零个或多个字符,LookAhead为零或多个字符后跟括号。
我认为这样可行,但不会:(?<=\(.?)x(?=.?\))
这个会选择括号之间的所有文字,但我只想要x
:(?<=\().?x.?(?=\))
我也试过这个(不确定你是否可以有两个lookbehinds ......但它不起作用:
(?<=\()(?<=.?)x(?=.?)(?=\))
我没有想法。
答案 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)
,我认为括号总是配对。
这里的问题是后视需要一个固定的长度,在这个问题中我们无法知道。
但如果(..)
始终配对,我们只需检查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}\))
等