web-dev-qa-db-ja.com

シェルで一重引用符をエスケープすることはできません

ディレクトリ内の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

私は何が間違っているのですか?

3
user13743

使用する " の代わりに '外側では、2つだけエスケープする必要があります"式の中。

echo "s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\(\"\./functions/include\.session\.inc\.php\"\);/g"
1
Nifle

一重引用符で囲まれた文字列内では、バックスラッシュエスケープでさえも、いかなる種類の拡張や評価も行われません。 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
1

二重引用符を使用してみませんか?

"s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g"
0
canen

一重引用符で一重引用符をエスケープします。たとえば、次のメッセージを表示してgitcommitを作成したいとします。BaseActiveRecordのsave()メソッドを更新しました。

これを行うには、次のコマンドを実行します(また、一重引用符を一重引用符でエスケープすることに注意してください)。

git commit -m 'Updated BaseActiveRecord''s save() method.'

二重引用符を使用して(単一引用符をエスケープせずに)目標を達成することもできます。

git commit -m "Updated BaseActiveRecord's save() method."

ただし、コマンドラインで二重引用符を使用すると、特定のものが展開されることに注意してください(つまり、$ vars)。お役に立てれば。

0
John Erck