Neden sed değiştirme için pencerelerde üç ters eğik çizgi gerekli olduğu doğrudur


2

Atıfta bu soru:

Neden ekstra \ ihtiyaç duyulan cmd.exe birlikte çalışmak sed (MinGW msys-1.0) ne zaman \ göre özel bir karakter değil cmd /? (son paragrafa bakınız veya İşte )?

Aşağıdaki özel karakterler tırnak işaretleri gerektirir: & amp; & Lt; & Gt; [] {   } ^ =; ! '+, `~ [beyaz boşluk]

İlk ters eğik çizgi ikinciden kaçar ve özel anlamını soyar. Kalan iki ters eğik çizgi verilir. sed ikinciyi kullanarak üçüncü sayıdan kaçar, bu yüzden aramda yer alan ve değiştirilen eşleşmiş tek ters eğik çizgi kalır. Ama yine de bu açıklamadan memnun değilim, çünkü:

cmd tokenizing yapmaz bu yüzden kaçmanın ilk adımı bir anlam ifade etmez. İşte , \ önceki zaman sadece bazı özel anlamı vardır "... peki gerçek açıklama nedir?

Linux'ta bash üzerinde:

echo 'sample\input' | sed 's/\\/----/'
sample----input

üzerinde cmd.exe Windows xp sp3'te (hayır ' ) Gerekli:

echo sample\input | sed "s/\\/----/"
sed: -e expression #1, char 9: unterminated 's' command 
// for some reason sed received only one backslash which causes him trouble ?

echo sample\input | sed "s/\\\/----/"
sample----input

Yanıtlar:


3

Sed yapıyor, "Bul" bölümünde bir regex kullanıyor. anahtara bağlı olarak BRE veya ERE veya PCRE kullanır. Ters eğik çizgi, bir regex içinde özeldir.

Katma

Tek tırnak kullanma sürümünüzü kullanmadım çünkü cmd.exe! cmd.exe, hiç değilse çift tırnak kullanır.

Ve iyi çalışıyor.

gnuwin32'nin sed çalışmasıyla, olması gerektiği gibi cmd.exe dosyasından sınandı.

C:\>echo sample\input | sed "s/\\/----/"
sample----input

C:\>sed --v
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.

Cygwin'in sed'sini test ediyor olsaydım, cygwin programlarının çalıştırılacağı yer olan cygwin penceresinden çalıştırdım. Sonra tek tırnak kullanırım. msys, bu anlamda cygwin'e benziyor.

GÜNCELLEŞTİRME

Cygwin'in sed komutunu cmd'den veya cygwin'den çalıştırabilirsiniz. Farklı GNU sürümleri oldukları için farklı davranıyorlar, ancak cygwin'den çalışan cmd'den (cmg için tek tırnaklar için basit nokta dışında ve cmd için çift tırnaklar hariç) çalışan kabukla ilgili bir sorun görmüyorum.

Ve cygwin'in daha sonra sed versiyonu var. Gnuwin32's sed, gnuwin32 grep de dahil olmak üzere birçok gnuwin32 olayı gibi, yıllarca eskidir. ve ör. daha sonra greps daha önce greps içinde hataları düzeltebilir. Gnuwin32'nin kullandığı ya da gnuwin32'nin kullandığı güncel sürüme göre daha az olan 2009 sed, tamam olabilir, ancak cygwin'in kullanacağı yeni bir sürümü kullanmak daha iyi olabilir.

İlginçtir, seds ters eğik çizgi ile ilgili farklı davranır .. Cygwin'in kullandığı sed, daha sonra çalıştığını görebilirsiniz.

C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\\/_/"
/usr/bin/sed: -e expression #1, char 6: unterminated `s' command

C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\\\/_/"
a_bc

C:\blah>echo a\bc | "c:\Program Files (x86)\GnuWin32\bin\sed" "s/\\/_/"
a_bc

Daha önceki sed (gnuwin32's sed), "s / \ / _ /" değerine izin verir. Böylece ters eğik çizgi gerçek bir ters eğik çizgi yapmak için ters eğik çizgiden kaçıyor. Ve iki ters eğik çizgiden sonraki eğik çizgi iyi kalır. Ve bunun içinde çalışır.

nota çalışan cygwin'in sedye cmd olması gayet iyi. Ve daha yeni bir sürüm olduğundan, gnuwin32'nin ayarlanması tercih edilir.

Daha sonra sed (cygwin's sed), "s / \ / _ /" ifadesine izin vermiyor çünkü / eğik çizgiden kaçıyor. İçgüdüsel (ve doğru içgüdüsel) başka bir ters eğik çizgi eklemeye çalışır ve ne olacağını görürsünüz. Ve çalışıyor. Emin değil mekanik ama sanırım daha sonra sed tek bir ters eğik çizgi \\\.

C:\blah>echo \ | c:\cygwin\bin\sed "s/\\\/d/"
d

Cevabımın sadece üçünü açıklamadığı için bazı şeyleri kısmen açıkladığını fark ediyorum. Neden iki değil
barlop

"windows" sed veya "unix" sed veya her ikisi de?
panny

@panny ne kullandığını veya neden cmd'de tek tırnak kullandığını bilmiyor. Ama ben onun bir sürümünü çift tırnak ile denedim ve iyi çalıştı, sadece iki backslah. AH, görünüşe göre msys kullanıyor.
barlop

Msys kullanıyorsanız, ekran görüntülerinde gördüğüm mingw32 gui'yi kullanmanızı öneririm. Cmd.exe kullanmak istiyorsanız, bir win32 bağlantı noktası kullanın. Gnuwin32'nin sed pencereleri vardır.
barlop

1
@panny Ben bir şeyleri karıştırmama eğilimindeyim. Yani, cygwin'in pencerelerinde cygwin'in penceresinde kullandığım şeyler. Msys kullanıyor olsaydım, onu bir mingw32 penceresinde kullanırdım. Ve gnuwin32 şeyler cmd.exe içinde kullanacağım Ama şeyleri karıştırmak istiyorsanız ben cmd içinde olduğu gibi cmd çift tırnak kullanmayı deneyin. Ancak işleri karıştırmak gereksiz görünüyor ve işleri karmaşık hale getirebilir
barlop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.