0

新しいホストに移動する Web サイトを更新する必要があります。次の行を各ファイルに、最初に出現した後に一度だけ追加したいと思います<?php

define('FRAMEWORK_LOCATION', '/home/someUser/framework.php');

この Perl ワンライナーのいくつかのバリエーションを試しました。

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's|<?php|<?php\rdefine('\''FRAMEWORK_LOCATION'\'', '/home/someUser/framework.php');'

ただし、ご覧のとおり、すべての行に影響します。イニシャルの後の追加コードのケースについては特に心配してい<?phpませんが、解決策がそれを考慮に入れている場合は、それも学ぶのに良いでしょう.


この問題の修正について詳しくは、ここをクリックしてください。また、さらに多くの例のデモ ページもご覧ください。

4

3 に答える 3

2
perl -ie 'undef $/; $txt = <>; $txt =~ s|<?php|<?php\rdefine("FRAMEWORK_LOCATION", "/home/someUser/framework.php")|; print $txt;'

また

perl -ie '$first = 1; while (<>) { if ($first && s|<?php|<?php\rdefine("FRAMEWORK_LOCATION", "/home/someUser/framework.php")|) { $first= 0; } print; }'
于 2012-08-11T11:51:57.777 に答える
1

これを試してください:

find . -name "*" -print0 | xargs -0 sed '0,/<?php/s/<?php/<?php\n\tdefine(...)/'
于 2012-08-11T11:56:35.280 に答える
1

perl を呼び出さずに sed を直接使用できます。

$ find . -name '*' -type f -print0 | xargs -0 sed -e '0,/<?php/s||&\ndefine("FRAMEWORK_LOCATION","/home/someUser/framework.php")|'

関連するビットは次のとおりです。

sed -e '0,/<?php/s||&\nNEW_TEXT|'

指定する場所:

  1. 範囲0,/<?php:最初の行から最初の出現まで<?php
  2. 置換s||&\nNEW_TEXT|: 前の一致<?phpをそれ自体で置換し、その後に新しい行を新しいテキストで置き換えます。

ディレクトリをフィルタリングするためにスイッチを追加したことに注意してください-type ffind

于 2012-08-11T11:58:24.330 に答える