Son zamanlarda komut satırında regex ile ilgili sorun yaşadım ve bir ters eğik çizgi eşleştirmek için farklı sayıda karakter kullanılabileceğini buldum. Bu sayı normal ifade için kullanılan kota bağlıdır (yok, tek tırnak, çift tırnak). Ne demek istediğim için aşağıdaki bash oturumuna bakın:
echo "#ab\\cd" > file
grep -E ab\cd file
grep -E ab\\cd file
grep -E ab\\\cd file
grep -E ab\\\\cd file
#ab\cd
grep -E ab\\\\\cd file
#ab\cd
grep -E ab\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\\cd file
grep -E "ab\cd" file
grep -E "ab\\cd" file
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\\cd" file
#ab\cd
grep -E "ab\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\\cd" file
grep -E 'ab\cd' file
grep -E 'ab\\cd' file
#ab\cd
grep -E 'ab\\\cd' file
#ab\cd
grep -E 'ab\\\\cd' file
Bu şu demek:
- tırnak işaretleri olmadan, bir ters eğik çizgiyi 4-7 gerçek ters eğik çizgi ile eşleştirebilirim
- çift tırnak ile, bir ters eğik çizgiyi 3-6 gerçek ters eğik çizgi ile eşleştirebilirim
- Tek tırnak işaretleri ile, bir ters eğik çizgiyi 2-3 gerçek ters eğik çizgi ile eşleştirebilirim
Ekstra ters eğik çizgi, kabuk tarafından (bash man sayfasından) göz ardı edildiğini anlıyorum:
"Tırnaksız ters eğik çizgi (\) çıkış karakteridir. Sonraki karakterin gerçek değerini korur."
Bu tek tırnaklı örnekler için geçerli değildir, çünkü tek tırnak içinde kaçış yapılmaz.
Ve ek bir ters eğik çizgi grep komutu tarafından yok sayılır ("\ c" sadece "c" kaçar, ancak bu "c" ile aynıdır, çünkü "c" ifadesinin özel bir anlamı yoktur).
Bu, tek tırnaklı örneğin davranışını açıklar, ancak diğer iki örneği gerçekten anlamıyorum, özellikle neden alıntılanmamış çift tırnaklı dizeler arasında bir fark var.
Yine, bash man sayfasından bir alıntı:
Msgstr "Karakterleri çift tırnak içine almak $,`, \ ve tarih genişletmesi etkinleştirildiğinde! Hariç, tırnak içindeki tüm karakterlerin gerçek değerini korur. "
Aynısını GNU awk (örn. awk /ab\cd/{print} file
) İle denedim, aynı sonuçlarla.
Bununla birlikte Perl farklı sonuçlar gösterir (örn. Kullanarak perl -ne
"/ab\\cd/"\&\&print file
):
- tırnak işaretleri olmadan, bir ters eğik çizgiyi 4-5 gerçek ters eğik çizgi ile eşleştirebilirim
- çift tırnak ile, bir ters eğik çizgiyi 3-4 gerçek ters eğik çizgi ile eşleştirebilirim
- Tek tırnak işaretleri ile bir ters eğik çizgiyi 2 gerçek ters eğik çizgi ile eşleştirebilirim
Herkes grep ve awk için komut satırında alıntılanmamış ve çift sıralı normal ifade dizeleri arasındaki farkı açıklayabilir mi? Perl'in davranışının bir açıklamasıyla ilgilenmiyorum, çünkü genellikle Perl tek gömleklerini kullanmıyorum.
printf "\ntest"
olsa bile, "test" ten önce bir yeni satır ekleyecektir ... (bu yüzden beklenen sonuç, "\ ntest", "ntest". Yazma alışkanlığını edinmeliyiz: ya da bir şekilde garipliğe dayanan bir sürü senaryo görüyorum"\n"
"n"
printf "\\ntest"
printf '\ntest'