Ada dua level interpretasi di sini: shell, dan sed.
Dalam shell, segala sesuatu di antara tanda kutip tunggal ditafsirkan secara harfiah, kecuali tanda kutip tunggal sendiri. Anda dapat secara efektif memiliki kutipan tunggal antara kutipan tunggal dengan menulis '\''
(tutup kutipan tunggal, satu kutipan tunggal literal, kutipan tunggal terbuka).
Sed menggunakan ekspresi reguler dasar . Dalam BRE, agar mereka diperlakukan secara harfiah, karakter $.*[\^
harus dikutip dengan mendahului mereka dengan garis miring terbalik, kecuali di dalam set karakter ( […]
). Surat, angka, dan (){}+?|
tidak boleh dikutip (Anda bisa lolos dengan mengutip beberapa dari ini dalam beberapa implementasi). Urutan \(
, \)
, \n
, dan dalam beberapa implementasi \{
, \}
, \+
, \?
, \|
dan backslash lainnya + alphanumerics memiliki arti khusus. Anda bisa lolos dengan tidak mengutip $^
di beberapa posisi di beberapa implementasi.
Selain itu, Anda perlu garis miring terbalik sebelumnya /
jika ingin ditampilkan di regex di luar ekspresi braket. Anda dapat memilih karakter alternatif sebagai pembatas dengan menulis, misalnya, s~/dir~/replacement~
atau \~/dir~p
; Anda akan memerlukan garis miring terbalik sebelum pembatas jika Anda ingin memasukkannya ke dalam BRE. Jika Anda memilih karakter yang memiliki arti khusus dalam BRE dan Anda ingin memasukkannya secara harfiah, Anda akan membutuhkan tiga garis miring terbalik; Saya tidak merekomendasikan ini, karena mungkin berperilaku berbeda di beberapa implementasi.
Singkatnya, untuk sed 's/…/…/'
:
- Tuliskan regex di antara tanda kutip tunggal.
- Gunakan
'\''
untuk mengakhiri dengan satu kutipan di regex.
- Letakkan garis miring terbalik sebelum
$.*/[\]^
dan hanya karakter tersebut (tetapi tidak di dalam ekspresi braket). (Secara teknis Anda tidak harus melakukan backslash sebelumnya, ]
tetapi saya tidak tahu implementasi yang memperlakukan ]
dan \]
berbeda di luar ekspresi braket.)
- Di dalam ungkapan kurung, untuk
-
diperlakukan secara harfiah, pastikan itu pertama atau terakhir ( [abc-]
atau [-abc]
, tidak [a-bc]
).
- Di dalam ekspresi braket, untuk
^
diperlakukan secara harfiah, pastikan itu bukan yang pertama (gunakan [abc^]
, bukan [^abc]
).
- Untuk memasukkan
]
dalam daftar karakter yang cocok dengan ekspresi braket, jadikan itu karakter pertama (atau setelah pertama ^
untuk set yang dinegasikan): []abc]
atau [^]abc]
(tidak [abc]]
juga[abc\]]
).
Dalam teks pengganti:
&
dan \
perlu dikutip dengan mendahului mereka dengan garis miring terbalik, seperti halnya pembatas (biasanya /
) dan baris baru.
\
diikuti oleh angka memiliki arti khusus. \
diikuti oleh huruf memiliki arti khusus (karakter khusus) dalam beberapa implementasi, dan \
diikuti oleh beberapa karakter lain berarti \c
atau c
tergantung pada implementasinya.
- Dengan tanda kutip tunggal di sekitar argumen (
sed 's/…/…/'
), gunakan '\''
untuk menempatkan tanda kutip tunggal dalam teks pengganti.
Jika regex atau teks pengganti berasal dari variabel shell, ingat itu
- Regex adalah BRE, bukan string literal.
- Di regex, baris baru harus dinyatakan sebagai
\n
(yang tidak akan pernah cocok kecuali Anda memiliki sed
kode lain menambahkan karakter baris baru ke ruang pola). Tetapi perhatikan bahwa itu tidak akan bekerja di dalam ekspresi braket dengan beberapa sed
implementasi.
- Dalam teks pengganti
&
,, \
dan baris baru perlu dikutip.
- Pembatas perlu dikutip (tetapi tidak dalam ekspresi braket).
- Gunakan tanda kutip ganda untuk interpolasi:
sed -e "s/$BRE/$REPL/"
.
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed