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を使用しているので、sed
ifは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()
。これにより、引用操作でミスを防ぐことができます。