0

PHP スクリプトでは、いくつかの式が$variable_like_that, $variable_like_other, $variable_this_thing, $variable_like_this... のように記述されています。これらを見つけて、このような未定義の変数として置き換えるのが好き'variable_like_that', 'variable_like_other', 'variable_this_thing', 'variable_like_this'です。それらはすべて $variable で始まります。

私はsedで何かをしようとしましたが、その構文は初心者にとって非常に奇妙です:

sed -e "s/$variable_(.*\)/('\)$variable_(.*\)\('\)/g" myscript.php

私はまだそれに精通していないことを知っています...

だから私の質問は:

  • sed はこの仕事に適したツールですか?
  • もしそうなら、私は物事を正しくするための助けに感謝します.
  • そうでない場合は、いくつかの提案をいただければ幸いです。
4

2 に答える 2

2

sed はこの仕事に適したツールですか?

sedあなたがやろうとしている仕事のための素晴らしいツールだと思います。あなたが試したパターンは近いものでしたが、いくつか問題がありました。

  • オプションは 、-e、および
  • 置換コマンドの検索/置換パターン。

どのオプション スイッチを使用すればよいですか?

sed -e結果を に出力するstdoutがファイルを変更しないの代わりに、 を使用してファイルを「その場で」sed -i編集し、行った変更をファイルに保存します。スイッチに関するsedのmanページから:-i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if extension supplied)

私の置換コマンドの検索/置換パターンはどうですか?

$variablesed に送信する置換コマンドについては、それ以外で始まり、その後で終わる文字列を照合する必要があります。そのために使用する検索パターンは次のとおりです。

\$\(variable\w\+\) 

それについてのいくつかのポイント:

  • (それ自体が特別な意味を持つため (行末)、$a でエスケープする必要があります)\$
  • \wは、単語のような文字と _ に一致する正規表現パターンです。
  • \+「前のパターンの 1 つ以上」を意味します
  • エスケープされた括弧内にあるものはすべて、たとえば、\(...\)パターンを交互にするか、置換のために「記憶」するためにグループに入れられます。私たちの場合、それらを使用して、交換のためにそれらを覚えています。

全体として、基本的には、「何かで始まり、$variable他の何かで終わる文字列を見つけて、見つけたものを覚えておいてください (ドル記号は括弧内にないため、ドル記号を除いて)」という意味です。

次に、置換パターンを指定する必要があります。見つけたいもののパターンがあるので、それを何に置き換えるかを指定するだけです。

'\1'

は「最初の後方参照」の\1略で、後方参照は「覚えておきたい最初のパターンに一致するもの ( の中に入れたもの\(\)) 」を意味する派手な用語です。

また、次の点に注意してください。

  • \(\)検索パターンにの複数のグループを含めることができます。2 番目は\2、3 番目は\3などです。
  • \0検索パターンに一致した文字列全体を含む特別な後方参照です。(この場合、$削除したい も含まれます。)

また、ファイル内の 1 行だけでなく、見つかったすべての検索パターンを置き換えたいと考えています。gこれは、「グローバル」を表すフラグで指定されます。置換コマンド 、s検索パターン、置換パターン、およびグローバル フラグは、すべてスラッシュ文字 で区切られ/ます。

置換コマンドは以上です。その後、ファイルの名前またはシェル ファイルのパターンを 3 番目の引数として sed に渡します。これをすべてまとめると、次のようになります。

sed -i "s/\$\(variable\w\+\)/'\1'/g" myscript.php

myscript.php作成した正規表現が必要なことを実行することをテストおよび検証するために、独自の小さなバージョンの をまとめました。参考までに、前後のバージョンを含めました。

前:

<?php
lorem ipsum $variable_like_that 
foo bar $variable_like_other baz
one two three $variable_this_thing four
$variable_like_this five six seven eight
?>

後:

<?php
lorem ipsum 'variable_like_that' 
foo bar 'variable_like_other' baz
one two three 'variable_this_thing' four
'variable_like_this' five six seven eight
?>

詳細については、Sed - An Introduction and Tutorial by Bruce Barnettも参照してください。

お役に立てれば!

于 2012-12-03T02:36:09.223 に答える
0

$ をエスケープし、右側に \1 を使用して、一致したものを () に置き換える必要があります

sed -e "s/\$variable_\([^ ,]*\)/'variable_\1'/g" myscript.php
于 2012-12-03T02:10:59.133 に答える