正規表現で次の項目を検索したいと思います。
package_name.some_function_name.foo()
これは行の一部になり、抽出されますが、some_function_name
次のように機能する必要があります。
if(some_function_name.foo()){
それがpackage_name
なくなった
私は試した:
git grep -h foo | perl -pe 's/.*\w.*(package_name[.])?(.*_.*)[.]foo.*/$2/'
しかし、うまくいきません
これ以外に、sedのようなより良い方法があれば、perl
私も同意します。
ベストアンサー1
あなたの.*\w.*(package_name[.])?(.*_.*)[.]foo.*
正規表現は単語文字を含む行と一致し、次にa(オプションであるため_
言及しませんでした)、。最後に表示される前の最後の単語文字とその間の内容をキャプチャします。package_name.
.foo
$2
_
.foo
.foo
例えば、
asd().x_y + x.foo() + blah_x++ - _x.foobar
^^^^^^^^
その後、s///
一致する行は全行に置き換えられますが(正規表現が全行と一致するため)、他の行は変更されずに残ります。
代わりに、次のようにすることができます。
perl -lne 'print for /(\w+)\.foo\(/g'
各項目の前の一連の単語文字を抽出し、.foo(
その前に少なくとも1つの単語文字が続きます。
something.
something
isの前にaがある場合にのみ、その単語文字シーケンスを許可するには、package_name
次のようにします。
perl -lne '
while (/(\w+\.)?(\w+)\.foo\(/g) {
print $2 if !$1 || $1 eq "package_name.";
}'
または以下も除外しますother.package_name.foo()
。
perl -lne '
while (/((?:\w+\.)*)(\w+)\.foo\(/g) {
print $2 if !$1 || $1 eq "package_name.";
}'