グローバルが選択されていない場合のPerl正規表現グローバル置換

グローバルが選択されていない場合のPerl正規表現グローバル置換

私はUbuntu 11.04を使用しており、テキストファイルから特定の「タグ」を検索し、それを同じ名前のテンプレートファイルから事前に作成された一部に置き換える小さなスクリプトを作成しました。

検索されるテキストファイルには各タグのインスタンスが2つしかありません。 1つ目はプレーンテキストで、2つ目は各バージョンごとに別々のスニペットを含むhtmlバージョンです。

スクリプトは次のとおりです。

for f in `ls -1 .templates/template_text`;
do
    g=`cat .templates/template_text/$f`
    find to_process/ -type f | xargs perl -i.old -p -e "s/$f/$g/";
done

for f in `ls -1 .templates/template_html`;
do
    g=`cat .templates/template_html/$f`
    find to_process/ -type f | xargs perl -i.old -p -e "s/$f/$g/g";
done

最初の正規表現で「グローバル」を指定しなかったにもかかわらず、両方のタグを置き換えるという問題が発生しました。これが私がPerlを呼び出す方法によるのか、バグなのか、それとも別のものなのかはわかりません。

どんな助けでも大変感謝します。

更新:Perlの代わりにsedを使用してスクリプトを機能させることができました。

for f in `ls -1 .templates/template_text`;
do
    g=`cat .templates/template_text/$f`
    h=`cat .templates/template_html/$f`
    find to_process/ -type f -print0 | xargs -0 -I {} sed -i -e "0,/$f/s/$f/$g/" -e "0,/$f/s/$f/$h/" {}
done

しかし、Perlコマンドを使って動作させる方法にはまだ興味があります。

ベストアンサー1

これは、Perlがテキストファイルを一度に1行ずつ読み、各行に置換パターンを適用するためです。したがって、タグが別の行に複数回表示されると、すべてが置き換えられます。

ファイルの最初の項目のみを置き換えるには、-0入力レコード区切り文字をNULL文字に設定し、置換を実行する前にperlにファイル全体を読み取るオプションを追加できます。

おすすめ記事