Metin dosyasındaki ters eğik çizgileri kaldırma


10

Sahibim

Giriş:

 NISHA =\455  

Çıktı:

 NISHA = 455

\Çıktıdan kaldırmak istiyorum . Komutu kullanmaya çalıştım sed "s/[\]//g" Pama çalışmıyor ve hata veriyor:

character found after backslash is not meaningful

3
POSIX olmayan bir uygulamanız var gibi görünüyor sed(veya muhtemelen bu komutu POSIX olmayan bir kabuktan mı çalıştırıyorsunuz?). Buna gerek yok sed, gerçi tryeterlidir: tr -d '\\' < P.
Stéphane Chazelas

Yanıtlar:


20

Örnek sonuçta gösterildiği gibi ters eğik çizgiyi boşlukla değiştirebilirsiniz:

sed 's/\\/ /g'

veya kodunuzda gösterildiği gibi kaldırabilirsiniz:

sed 's/\\//g'

Özel karakterler

Özel anlamını iptal etmek için ters eğik çizgiden kaçmanın olası sorunları vardır. Ters eğik çizgi, hem kabukta hem de düzenli ifadelerde kaçmak için kullanılan özel bir karakterdir.

Kabuğun komut satırına veya komut dosyasına yazdığınız komut ilk olarak, karakterlerin özel anlamlarını ve bunların kaçışlarını yorumlayan kabuk tarafından işlenir. Sonuç daha sonra sed, karakterlerin kendi yorumunu yapan yürütülecek (gibi ) komuta iletilir . Bir komut oluştururken zihinsel prosedür tam tersidir: önce normal ifade için kaçmayı ekleyin, sonra kabuk için kaçmayı ekleyin.

  1. Bir regexdeki (gibi komutlara giriş sed, grepvs.) ters eğik çizgi böyle ters eğik çizgiden edilebilir: \\ve ayrıca ayarlanan ifade kullanabilirsiniz [\]orada ters eğik çizgi, özel anlamını yitirir çünkü eskisi gibi.

  2. Bir kabukta (gibi bash) ters eğik çizgi ile ters eğik çizgiden kaçabilirsiniz. Yani \yazmak yerine \\. Dizeyi çift tırnak işaretleri arasına almak "ters eğik çizgi davranışını daha karmaşık hale getirir <1> ancak çift ters eğik çizgi yine de tek bir ters eğik çizgi oluşturur. Dizeyi tek tırnak işaretleri arasına almak ', hariç tüm karakterlerin işlenmesini sağlar '.

Kullanmak isterseniz çift tırnak :, aşağıdakilerden birini kullanabilirsiniz
sed "s/\\\\//g"Escape - \tarafından \kabuğunda ve her kaçış \tekrar regex. Aslında, bu durumda çift tırnak işareti gerekli değildir, çünkü her özel karakter düzgün bir şekilde kaçmıştır.
sed "s/[\\]//g"- Kabuktan bir ters eğik çizgi \ile kaçış ve regex'te bir set kullanın [ ].
sed "s/[\]//g"- Evet, örneğiniz POSIX uyumlu bir ortamda çalışmalıdır! Çift tırnaklar arasında, çift tırnak \bağlamında özel bir karakterden önce $`"\veya yeni satırdan önce kendini temsil eder . Durumunuzda kabuk veya sedPOSIX standardına uymuyor gibi görünüyor .

Tek tırnak işareti ile , dizeyi kullandığınız gibi veya daha kısa bir yolla da kullanabilirsiniz:
sed 's/[\]//g'
sed 's/\\//g'


6

Ters eğik çizgiden kaçmak zorundasınız. Bunu dene:

sed 's/\\//g'

3

Sed çözümlerini istemiyorsanız, aşağıdaki komutları deneyin:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11

2

Awk olarak, böyle yapardım,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455

1
sed 's/\\//'

Bir koyun \önce \size en özel karakterleri ile yaptığı gibi.


Sen atladık gbilinmeyen bir nedenden dolayı bayrak. Bu komutun davranışını değiştirir, ancak soruda böyle bir değişiklik istenmedi. Aksi takdirde yanıtınız önceki yanıtlara kıyasla yeni bir şey getirmez.
pabouk
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.