このサイトには、sed のさまざまな要素をエスケープする方法について多くの質問がありますが、より一般的な回答を探しています。シェルの拡張を避けるために、一部の文字をエスケープしたい場合があることを理解しています。
バッシュ:
- 単一引用符で囲まれた [文字列] ('') は、引用符で囲まれた各文字のリテラル値を保持するために使用されます。[ただし、]バックスラッシュが前にある場合でも、単一引用符の間に単一引用符が発生しない場合があります
。- バックスラッシュは、その後にドル、バックティック、二重引用符、バックスラッシュ、または改行が続く場合にのみ、 [二重引用符で囲まれた文字列で]その意味を保持します。二重引用符内では、これらの文字のいずれかが後に続く場合、バックスラッシュは入力ストリームから削除されます。特別な意味を持たない文字の前にあるバックスラッシュは、シェル インタープリターによる処理のために変更されずに残されます。
sh : (履歴拡張がないことを願っています)
- 一重引用符で囲まれた文字列の動作: bash と同じ
- 文字を二重引用符で囲むと、ドル、一重引用符、バックスラッシュ、および履歴拡張が有効な場合は感嘆符を除いて、引用符内のすべての文字のリテラル値が保持されます。
- 文字
dollar
と一重引用符は、二重引用符内での特別な意味を保持します。- バックスラッシュは、次のいずれかの文字が続く場合にのみ、特別な意味を保持します:
$
、'
、"
、\
、または改行。二重引用符は、その前にバックスラッシュを付けることにより、二重引用符内で引用できます。- 有効にすると、二重引用符で囲まれた感嘆符 がバックスラッシュを使用してエスケープされない限り、履歴の展開が実行されます。! の前のバックスラッシュ 削除されません。
...しかし、エスケープを削除するとすぐにこれが機能しなくなる理由を説明するものはありません:
sed -e "s#\(\w\+\) #\1\/#g" #find a sequence of characters in a line
# why? ↑ ↑ ↑ ↑ #replace the following space with a slash.
(
、)
、/
または+
(または[
、または...) のいずれ]
も、機能するためにエスケープする必要がある特別な意味を持っているようには見えません。地獄、Python からコマンドを直接呼び出しても sed は正しく動作しませんが、マンページにはこれについて何も詳しく説明されていないようです (とにかく、バックスラッシュを検索したときではありません)。
$ lvdisplay -C --noheadings -o vg_name,name > test
$ python
>>> import os
>>> #Python requires backslash escaping of \1, even in triple quotes
>>> #lest \1 is read to mean "byte with value 0x01".
>>> output = os.execl("/bin/sed", "-e", "s#(\w+) #\\1/#g", "test")
(Output remains unchanged)
$ python
>>> import os
>>> output = os.execl("/bin/sed", "-e", "s#\(\w\+\) #\\1\/#g", "test")
(Correct output)
$ WHAT THE HELL
Have you tried using jQuery? It's perfect and it does all the things.