In perl I want to achieve the following translation:
stmt1; gosub xyz;
to
stmt1; xyz();
How can I do this?
In perl I want to achieve the following translation:
stmt1; gosub xyz;
to
stmt1; xyz();
How can I do this?
すでに与えられた答えはおおよその答えを提供しています。これはあなたのエッジケース(セミコロンの欠落、セミコロンの後の追加節)に対処します。
perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'
gosub
キーワードの後に「セミコロンではない」空白が続く任意の文字列に一致し、それらを削除します。また、global 修飾子も追加しました/g
。これは、可能なすべての置換を 1 行で行いたいと思われるためです。単語境界\b
を使用して部分一致を防ぐことに注意してください。たとえば、 replace を使用しないでくださいlegosub
。
単語の境界が十分でない場合、たとえば、単語の文字間に区切りが生じる1.gosub
ために置換される.
場合は、代わりに否定の後読みを使用できます。
perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'
これには、前の文字gosub
がセミコロンまたは空白以外のものではないことが必要です。二重否定は、不一致 (行頭) も許可することに注意してください。
編集するファイルのコマンド ラインから実行します (file.ext を置き換えます)。
perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
my $str = 'stmt1; gosub xyz;';
$str =~ s/gosub (.*?);?/$1();/;
print $str;