SED komutu satırbaşını iade ediyor


0

SED komutuyla ilgili bir sorunum var @ karakterini bir dizeyle değiştirmem ve csv dosyasındaki bir sütuna bir dize eklemem gerekiyor

Yani

foo@example.com 

Olacaktı

foo_X_example.com@newdomain.com

Aşağıdaki sed komutunu kullanıyorum

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\2@newdomain.com/' Test.csv

Ama komutta bir yerde yeni bir satır sonu var.

foo_X_exxample.com
@newdomain.com

SED komutumdaki hatanın nerede olduğunu bilen var mı?


CSV dosyası Windows (CR / LF) biçimindeyse, bunun gibi bir şey alabilirsiniz. Bu durumda \reşleşmeyen karakterlere ekleyin .
AFH

Evet, Mac’i CSV biçiminde kaydedilmiş bir Windows dosyasına sahip olarak kullanıyorum
B Farrell

1
Denedin sed -i .bak -E 's/([^,\r\n\“]*)@([^,\r\n\“]*)/\1_X_\2@newdomain.com/' Test.csvmi Bu çözmeli. Bana haber ver, bir cevap vereceğim.
AFH

Teşekkürler AFH - denedim ama yine de önceki gibi
B Farrell

Bunu foo@example.comCR / LF ile takip eden bir dosya oluşturarak denedim ve tamam işe yaradı, \rarama alanlarında olmadan önce geri dönüş karakterini korudu @. Diğer seçeneğiniz, dos2unixdosyayı kullanmadan önce dosyadaki yardımcı programı kullanmaktır sed, ancak ilk yöntemin aksine bu, Windows dosya biçimini kaybeder. Ubuntu Linux kullanıyorum, ancak Linux tabanlı olmasına rağmen Mac OS'niz farklı bir son satır sırası kullanıyor olabilir.
AFH

Yanıtlar:


1

Orijinal dosyanızın test.csvWindows formatlı olduğu, her yeni satır için dönüş ( 0x0dveya \r) ve satır beslemesi ( 0x0aveya \n) olduğu anlaşılıyor . Sizin seddışlamaz arama paterni \ryüzden bu ikinci eşleşen alan ve çıkış tutulacaktır önce eklenen metin.

Yani asıl komutun:

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\2@newdomain.com/' Test.csv

çıktı dosyasını verir ( od -ckontrol karakterlerini görmek için kullanarak ):

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m  \r   @   n   e   w   d   o   m   a   i   n   .   c   o   m
0000040  \n

\rDışlanan karakterlere eklerseniz :

sed -i .bak -E 's/([^,\r\n\“]*)@([^,\r\n\“]*)/\1_X_\2@newdomain.com/' Test.csv

daha sonra orijinal yeni satır dizisi korunur:

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m   @   n   e   w   d   o   m   a   i   n   .   c   o   m  \r
0000040  \n

İhtiyacınız olmadığına \rveya \nilk eşleşme alanına ihtiyacınız olmadığına dikkat edin , çünkü bu sedkomut biçimi yeni satırlarla değil, yalnızca tek satırlar içinde eşleşir.

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.