新しい行と中括弧の一致

新しい行と中括弧の一致

sed文字列+改行文字+左中括弧を一致させるには。をお試しください。

sub feature_get_web_php_mode
{
my ($d) = @_;
my $server = &find_domain_server($d);

こうなる

sub feature_get_web_php_mode
{
return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);

私の式の正規表現は次のとおりです。s|sub feature_get_web_php_mode\n{|CHANGE_CODE|しかし、うまくいきません。

開かれた中かっこが最初に一致しない理由を見つけようとしましたが、手がかりはありません。

よろしくお願いします。

答え1

開かれた中かっこが最初に一致しない理由を見つけようとしましたが、手がかりはありません。

デフォルトではsed一度に1行ずつ機能するため、読み取った行を含めることはできません\n。 GNUを使用しているので、sedifはNUL()文字で区切られたテキストブロック-zで作業するためのオプションを提供します。\0コマンドを変更するために必要な唯一のことは、次の-zオプションを追加することです。

sed -z "s|sub feature_get_web_php_mode\n{\n|&return 'fcgid';\n|"

入力ファイルにNUL文字がないと予想されるため(通常のテキストファイルのように見える)、処理できるようにメモリに完全にロードされますsed(プログラム文書なので無害になる可能性があります)。 )。

ファイルが大きすぎる場合は、次の代替バージョンを試してください。

sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\nreturn 'fcgid';|; }"

ちなみに、次のバージョンはPosixと厳密に互換性があります。

sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\\
return 'fcgid';|; }"

答え2

テキストの変更

sub feature_get_web_php_mode
{
my ($d) = @_;
my $server = &find_domain_server($d);

入力する

sub feature_get_web_php_mode
{
return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);

sub feature_get_web_php_mode次の行に続く文字列を一致させ、新しい{行を挿入して

return 'fcgid';

あなたはする必要があります

sed '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\
'"return 'fcgid'"';
}' file

その後、正しい行を見つけますsub feature_get_web_php_mode。見つかった場合、このNコマンドは入力バッファに次の行を追加し、その間に改行を追加するために使用されます。次に、パターンが\n{$一致した場合、読み取った行はN単一文字であり、{新しい行を追加できます。

新しい行はコマンドで追加されますa。コマンドaは次のとおりです。

a\
text to be added

追加するテキストに一重引用符が含まれており、スクリプトが一重引用符で囲まれているため、一時的にプログラムの一重引用符を区切り、二重引用符sed内にテキストを追加します。sed

または、式全体を二重引用符で囲みます(ここで\次の内容をエスケープする必要があることを忘れないでくださいa)。

sed "/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\\
return 'fcgid';
}" file

GNUを使用すると、sed次のことができます。

sed -e '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a \' -e "return 'fcgid';" -e '}' file

他のsed実装でも実行できますが、追加された行の後に改行文字を挿入できない場合があります。


別の方法は、パッチファイルを準備することです。

diff -u file.old file.new >file.patch

これにより、パッチファイルが次のように見えることがあります。

--- file.old    Wed May 12 22:44:00 2021
+++ file.new    Wed May 12 22:44:15 2021
@@ -1,4 +1,5 @@
 sub feature_get_web_php_mode
 {
+return 'fcgid';
 my ($d) = @_;
 my $server = &find_domain_server($d);

ファイルに適用するには、変更を含む新しいファイルを作成します。

patch -o somefile.patched somefile <file.patch

それ以外の場合は、-o somefile.patch変更がに直接適用され、somefile元のファイルがにバックアップされますsomefile.orig

答え3

subroutineコードでaの定義を編集したいようですperl

ちなみに、Perlサブルーチンは変数のように定義/オーバーライドできます。

これを行うには、次の 3 つの手順をコードに追加して必要な変更を行います。

{
  no warnings q(redefine);
  undef &feature_get_php_mode;
  *feature_get_php_mode = sub { return q(fcgid); };
}

ただし、コードを編集する必要がある場合は、次のことができます。

sed -e '
  /^sub feature_get_web_php_mode$/!b
  n;/^{$/G
  s/\n/&return q(fcgid);/
' file

メモ:-

  • 私は演算子を通して一重引用符で囲まれた文字列を使用するPerlishメソッドを使用しましたq()。これにより、引用操作でミスを防ぐことができます。

関連情報