ディレクトリ内のphpファイルのバッチに対してPerl置換を実行するコマンドを作成しようとしています。置き換えたい文字列には一重引用符が含まれており、シェルで適切にエスケープすることができません。
エスケープされていない引用符で文字列をエコーして、Perlが何を取得するかを確認しました。
echo 's/require_once\('include\.constants\.php'\);/require_once\('include\.constants\.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'
結果に一重引用符が含まれていません。
s/require_once\(include.constants.php\);/require_once\(include.constants.php\);require_once\("\./functions/include\.session\.inc\.php"\);/g
ただし、一重引用符をエスケープしようとすると、次のようになります。
echo 's/require_once\(\'include\.constants\.php\'\);/require_once\(\'include\.constants\.php\'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'
コマンドを完了するためのプロンプトが表示されます。
>
私がそれを解析したいのはこれです:
s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g
私は何が間違っているのですか?
使用する "
の代わりに '
外側では、2つだけエスケープする必要があります"
式の中。
echo "s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\(\"\./functions/include\.session\.inc\.php\"\);/g"
一重引用符で囲まれた文字列内では、バックスラッシュエスケープでさえも、いかなる種類の拡張や評価も行われません。 Nifleとcanenが投稿したように、代わりに二重引用符を使用し、一重引用符の代わりにそれらをエスケープします。ただし、シェルの利益のためにそれらをエスケープする必要があるだけです。このs///
をPerlスクリプト内で直接使用する場合は、通常はs///
を最初から引用符で囲むことはないため、エスケープする必要はありません。
さらに、置換文字列に区切り文字s///
が含まれているため、/
操作は失敗します。バックスラッシュ-/functions/include
のスラッシュをエスケープします。
s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\.\/functions\/include\.session\.inc\.php"\);/g
または別の区切り文字を選択します。
s@require_once\('include.constants.php'\);@require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);@g
二重引用符を使用してみませんか?
"s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g"
一重引用符で一重引用符をエスケープします。たとえば、次のメッセージを表示してgitcommitを作成したいとします。BaseActiveRecordのsave()メソッドを更新しました。
これを行うには、次のコマンドを実行します(また、一重引用符を一重引用符でエスケープすることに注意してください)。
git commit -m 'Updated BaseActiveRecord''s save() method.'
二重引用符を使用して(単一引用符をエスケープせずに)目標を達成することもできます。
git commit -m "Updated BaseActiveRecord's save() method."
ただし、コマンドラインで二重引用符を使用すると、特定のものが展開されることに注意してください(つまり、$ vars)。お役に立てれば。