非常に単純なASPコードを含むファイルディレクトリをPHPサーバーに移行し、検索と置換メカニズムを使用してすべてのファイルの内容を変更する必要があります。私は正規表現をうまく使いませんでしたが、それを使っていくつかの点を変更しました。
find . -name "*.php" -print0 | xargs -0 -n 1 sed -i -e 's/oldstring/newstring/g'
置き換える必要がある複雑な文字列があります。以下を参照してください。
から:
<% if request("page") = "" then %>
到着する:
<?php if(!isset($_GET['page']) || !$_GET['page']){ ?>
この*は任意の数字にすることができ、*を持つ「TO」にその数字を保持します。
から:
<% elseif request("page") = "*" then %>
到着する:
<?php } elseif($_GET['page'] == '*'){ ?>
最後はとても簡単です。から:
<% end if %>
到着する:
<?php } ?>
ディレクトリでこの操作を繰り返しバッチ実行できる場合、このファイルのASPコードの98%が修正されます。さまざまな方法でこれらの文字列をエスケープしてみましたが、どのように動作させるかわかりません。助けてくれてありがとう!
答え1
これを行う方法はいくつかあります。 Perlを活用することをお勧めします。quotemeta
機能。
まず、タブ区切り最初の列の検索パターンと2番目の列の代替項目を含むテキストファイル:
$ cat pats.txt
<% if request("page") = "" then %> <?php if(!isset($_GET['page']) || !$_GET['page']){ ?>
<% elseif request("page") = "*" then %> <?php } elseif($_GET['page'] == '*'){ ?>
<% end if %> <?php } ?>
内容は次のようなテストファイルを作成しました。
$ cat foo.asp
<% if request("page") = "" then %>
<% elseif request("page") = "*" then %>
<% end if %>
Perlが構造に来ます:
find . -name "*.php" | while IFS= read -r file; do
perl -i.bak -e 'open(A,"pats.txt");
while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]}
while(<>){
foreach $pat (keys(%k)){
s/$pat/$k{$pat}/;
}
print}' $file;
done
Perlのフラグは、オプションのバックアップサフィックスを指定できる-i
場所と同じように機能します。sed
上記の例では、foo.php.bak
処理された各ファイルに対して名前付きファイルが生成されます。-i
バックアップが必要ない場合は、単独で使用してください。
説明する:
スクリプトはパターンと置換項目を読み取り、%k
置換項目が値であるキーのハッシュ()としてパターンを保存します。このquotemeta
関数は、ASCII以外の(一致しない[A-Za-z_0-9]
)文字をすべてエスケープします。
そのスクリプトは2番目のファイルを開き、各行の各パターンを見つけてそれに応じて置き換えます。検索パターンがエスケープされているため、quotemeta
正しく認識されます。
ノート
これは明らかにすべての行ですべてのパターンを見つける必要があるため、最も効率的なアプローチではありません。それでも、すべてを手動で回避するよりも機能し、はるかに簡単です。
名前に新しい行が含まれるファイルの場合、スクリプトは失敗します。ここでは問題にならないと思います。