2017-12-29 49 views
1

私は2つのWordPressファイル(php)をプラグインから入手し、更新するたびに私に最も適したいくつかの行の自動修正を取得したいと思います。シェルスクリプトからの完全な内容の行の検索と置き換え

私はCentOSでウェブサイトを運営しています。私はマシンを完全に制御しています。したがって、自動化されたタスクのためにCron経由でシェルスクリプトを実行できます。

サードパーティ製のプラグインであり、所有者が自分のウェブサイトのみのカスタマイズであるため、場所を変更する可能性があるため、行番号ではなく検索と置換ができます。これはバグではなく、私のウェブサイトの改善点です)。私はこれらの2つのファイルを適用するmodsのトンであり、私はちょうどこれを行う方法のアイデアが必要なので改造機を短くします。 function dump_files($warning = false) {とで置き換えます:

クラスrecovery.php

検索用のためfunction dump_files($warning = false) { $cancel_order;

クラスprompt.php

検索:private $replace_only;とで置き換える:private $replace_only = true;

どのようにすることができます私はこれをやる?私はStackOverFlowをブラウズしていましたが、一部のユーザーはsedを検索と置換に使用することを提案しましたが、これはテキストではなくphp個のファイルなので、sedには当てはまりますか?それとももっと良い解決策がありますか?

--EDIT これは複数行の検索でSEDを使用してどのように置き換えることができますか?私は伝統的な方法を使用していましたが、2行以上の字下げでは置き換えられません。例:のようなものに

if (empty($donot_dump)) { 
       return false; 

if (empty($donot_dump)) { 
       return true; 

答えて

1

はい、のコースsedは、そのことについては任意のテキストファイル形式に適用することができます。検索と置換には、構文s/orignial/replaceの構文を使用するだけです。 -iの構文を使用すると、ファイルの内容が直接置き換えられます。だから、あなたが必要とするすべては

sed -i.bak "s/function dump_files(\$warning = false) {/function dump_files(\$warning = false) { \$cancel_order;/g" class-recovery.php 

と第二のファイルの

sed -i.bak "s/private \$replace_only;/private \$replace_only = true;/g" class-prompt.php 

通常、我々はsedの引数の周り'(一重引用符)を使用しますが、我々は元の文字列の前後に空白を持っているので、我々がする必要がありますそれを保持すると、文字列を二重引用符で囲みます。また、二重引用符で囲まれた変数は、$に特別な意味を持ちます。つまり、シェルは変数を変数として扱い、展開しようとします。変数ではなく文字通りの単語であることを知らせるには、\でエスケープする必要があります。

は、.bakの下にファイルのコピーを保存して元のファイルと置き換えて、sedがファイルの内容を意図したとおりに置き換えない場合はいつでもこのファイルで復元できます。

.bakを削除し、バックアップファイルを保存しない場合は、-iとしてください。


あなたの置換文字列は、改行文字は、必要に応じて書式設定を持つように\\nといつものスペースを使用する必要がある場合。例えば、

sed "s/function dump_files(\$warning = false) {/function dump_files(\$warning = false)\\n { \$cancel_order;/g" file 

function dump_files($warning = false) 
{ $cancel_order; 
+0

グレート以下のような出力を生成します!ありがとうございました:) – Diego

関連する問題