Bir dosyadaki tırnak işaretlerini sed ile nasıl değiştirebilirim?


12

Birden çok xml satırı içeren bir dosya var. Dosyanın belirli bölümlerini değiştirmek istiyorum. Dosyanın bazı bölümleri "değiştirmek istediğiniz tırnak işaretleri ( ) içeriyor . Tırnak işareti ile kaçmaya çalışıyorum \, ama bunun dosyamın sonucuna göre çalıştığını sanmıyorum.

İşte benim sed komutlarımdan bir örnek:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

Sed komutunda tırnak işaretlerinden kaçmak mı yoksa yanlış bir şey mi yapıyorum?


2
Komutunuz yerine "text"geçmek için doğru görünüyor 'text'. Tabii ki hiçbir şey yapmaz "othertext". Birkaç girdi satırı, karşılık gelen istenmeyen çıktıyı gösterin ve bunun yerine hangi çıktıyı istediğinizi açıklayın.
Gilles 'SO- kötü olmayı bırak'

Yani \"sed komutu tırnak işareti kaçan doğru yoldur?
jbranchaud

4
Sed için değil: sed'in kaçmasına gerek yoktur ". Ancak shell komutunuz çift tırnaklı bir dize kullanır ve \"orada doğrudur. sedProgram gördüğü s/"text"/'text'/igiçin argüman olarak -e.
Gilles 'SO- kötü olmayı bırak'

@Gilles Uzaylar ne olacak? Sed beyaz boşlukları anlıyor ve saygı duyuyor mu? Örneğin, komutum içerdiyse, s/\"text\" /'text'/igyalnızca "text" ondan sonraki boşlukla mı bulunur?
jbranchaud

3
Boşluklar tam olarak eşleşmelidir. Bu diyalogu sürdürmek yerine, bazı örnek girişler ve karşılık gelen istenen çıktıları göndermenizi tavsiye ederim (ve belki de alıntıyı neden değiştirmeniz gerektiğini açıklayın). İş sediçin doğru araç olduğu bile belli değil , belki bir XML ayrıştırıcı istersiniz.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


13

İki ipucu:

  1. Tek tırnak işaretli bir dizede tek tırnaktan kaçamazsınız. Bu yüzden teklifi kapatmanız, kaçan bir teklif eklemeniz ve ardından tırnak işaretlerini tekrar açmanız gerekir. Yani 'foo'\''bar', şu şekilde parçalanır:

    • 'foo'        alıntı foo
    • \'             kaçtı '
    • 'bar'        alıntı bar

    verim foo'bar.

  2. (isteğe bağlı) /sed'de kullanmak zorunda değilsiniz . Ben kullanarak bulmak /ve \aynı sed ifadede okumayı zorlaştırır.

Örneğin, tırnakları bu dosyadan kaldırmak için:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

Yukarıdaki iki ipucum göz önüne alındığında, hem çift hem de tek tırnakları kaldırmak için kullanabileceğiniz komut:

$ sed -e 's|["'\'']||g'  /tmp/f

İlk ipucuma dayanarak, kabuk sed'in ikinci argümanını (yani, arkasından gelen dize -e) azaltır s|["']||gve bu dizeyi sed'e iletir. İkinci ipucuma dayanarak, sed buna aynı davranır s/['"]//g. Anlamı

eşleşen tüm karakterleri kaldırın 'veya "   (yani hiçbir şeyle değiştirmeyin)

Muhtemelen istediğini yapmak için bundan daha karmaşık bir şeye ihtiyacın var, ama bu bir başlangıç.


1
İkinci ipucunuza daha ince bir nokta koymak için: s ve y komutlarını kullanırken / kullanırken, muhtemelen diğerleri arasında herhangi bir karakteri kullanabilirsiniz. Diğer sed komutlarıyla regexps kullanılırken, ilk sınırlayıcı (/ için bir alternatif kullanılıyorsa) kullanılmalıdır. Normal ifade içinde eşleştirmeye çalışıyorsanız, tercih ettiğiniz sınırlayıcıdan da kaçılmalıdır.
Eli Heady

Tek tırnakları ve çift tırnakları dağınık olmadan karıştırmak zordur. Bazı insanlar , tek tırnaklardan alıntı yaparsanız , bunları kaçmak yerine çift tırnak içine alarak okumayı daha kolay bulur . Yani, daha ziyade 'foo'\''bar'kullanabiliriz 'foo'"'"'bar'.
Scott

1

Komutlar biraz farklı görünüyor bu yüzden unix yardımcı programlarının bir Windows bağlantı noktası var ama virgül ve alıntı işaretleri ile bir csv dosyası vardı. Bu iş parçacığı bir kılavuz olarak kullanarak, bu komutla tırnak kaldırmak başardı:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

Teşekkürler! bunun üzerine sıkışmış!
sendbits
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.