MacOS'ta vir'deki yeni satırla virgül değiştirilsin mi?


287

Virgülle ayrılmış kimliğin bir dosyası var. Virgülleri yeni bir satırla değiştirmeye çalışıyorum. Denedim:

sed 's/,/\n/g' file

ama bu çalışmıyor. Neyi kaçırıyorum?


12
deneyin tr , '\n'. Sanırım sed \ndüz metin gibi davranıyor .
Prens John Wesley

1
İşe yaradı! kedi dosyası | tr, '\ n'
WildBill

7
tr , '\n' < file- boru yok.
Prens John Wesley

gSenaryo sonunda ne işe yarıyor? Onsuz da aynı davranışı alıyorum.
HelloGoodbye

Hangi kabuğu kullanıyorsun? Bu benim için çalışıyor, bash kabuğunu kullanarak.
HelloGoodbye

Yanıtlar:


362

trBunun yerine kullanın :

tr , '\n' < file

'yerine' bakıyordum. dönemi, ve bu aradığım çözüm oldu :)
Jonah

1
Bash kabuğu $ tr, '\ n' aitr kullanımında wokring değildir: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Öğrenci

5
Noktalı virgülle noktalı virgül kullanılması da işe tr ',' ';' < input.csv > output.csv
yarar

304

Bir kullan ANSI-C alıntı dize $'string'

Sed'e ulaşmak için ters eğik çizgiden kaçan gerçek bir satırsonuna ihtiyacınız var. En azından bash'de, $''dizeler \ngerçek bir yeni satırla değiştirilecek , ancak sonra sed'in yeni satırdan kaçmak için göreceği ters eğik çizgiyi ikiye katlamanız gerekiyor, ör.

echo "a,b" | sed -e $'s/,/\\\n/g'

Not Bu bütün kabukları çalışmaz , ama en yaygın olanları üzerinde çalışacak.


5
garip, aynı zamanda bir ters eğik çizgi ile daha az yani çalışır echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly

2
Upvoted. Daha fazla bilgi için, "QUOTING" bölümüne bakın man bash.
15:23

7
OSX 10.11 ile çalıştım:, sed -E $'s/<\\/br>/\\\n/g' filegnu-sed kurmaya gerek yok
Brice

2
Verilen örnekle OS X 10.7 üzerinde çalıştığı doğrulandı. -eBölüm gerekli değildir görünüyor.
Yongwei Wu

1
cevaptaki örnek hemen benim için OSX 10.11.5'te çalışıyor
Jurriaan Roelofs

122
sed 's/,/\
/g'

Mac OS X üzerinde çalışır.


3
Bunun için teşekkürler - Eski linux numaramın neden OSX'te çalışmadığını merak ettim. Ama öyle!
Wyatt8740

6
Bir sed komut dosyasında çalışan tek çözüm budur.
Firstrock

6
Eğik çizgi bu Not kaçar o: (bu komut terminatör değil ki) hazır bir yeni satır olmayan (Bash gibi, vs) bir satır devam karakteri. Farkı görmek için, yukarıdaki komutu tırnak işaretleri olmadan yazmaya çalışın: ters eğik çizgi, kabuk tarafından bir satır devam karakteri olarak yorumlanacak ve yeni satır atılacaktır. Tersine, alıntılanan ifadenin içeriğini (tırnak işaretleri olmadan) ayrı bir virgül-newline.sed dosyasına (kabuk sözdizimini ortadan kaldırır) ekleyin ve işe yarar!
Nils von Barth

1
bu bir karakterin yerine her şeyin yerini alabileceği için iyidir. tr sadece karakterlerle çalışıyor gibi görünüyor. ilk parametre olarak bir dize koyarsanız, dize yerine karakterlerin tüm oluşumunu değiştirir.
Shawn

1
@Droogans Bash, sh veya başka bir kabuk mu kullanıyorsunuz? Çift tırnak yerine tek tırnak kullandığınızdan emin misiniz?
Max Nanasy

22

Sed kullanımınız tamamen ikame ifadeleri olma eğilimindeyse (benimki olduğu gibi), perl -pebunun yerine

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

Görünüşe göre \ranahtar!

$ sed 's/, /\r/g' file3.txt > file4.txt

Bunu dönüştürdü:

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

Buna:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

Sorunun OS X yazdığını biliyorum, ancak bu GNU sed-4.2.2-6.fc20.x86_64 ile çalışmaz.
Cristian Ciupitu

10
Bunun \raynı olmadığını unutmayın \nve bu daha fazla veri manipülasyonu ve kullanımını bozabilir.
Joel Purra

3
Üzgünüm, bu benim için işe yaramadı. Bir satırsonu olması gereken bir 'r' aldım.
Frank de Groot - Schouten

Bunun verdiği cevabı daha açık hale getirmelisiniz \r!
pir

Benim için çalıştı ama nedenini merak ediyorum! \ n unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

Bu MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) ve RHE Linux (Red Hat Enterprise Linux Server sürüm 5.3, Tikanga) üzerinde çalışıyor ...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

... nerede ^Jyapılır ctrl+ v+ j. Sakıncası var mı \önce ^J.

PS, RHEL'deki sed'in GNU olduğunu, MacOS sed'in FreeBSD tabanlı olduğunu ve Solaris sed'den emin olmadığım halde, bunun herhangi bir sed ile hemen hemen işe yarayacağına inanıyorum. YMMV ...


12

MacOS farklı, mac'te sed ile bu sorunu çözmenin iki yolu var

  • İlk olarak, \'$'\n''değiştirin kullanın \n, MacOS'ta çalışabilir:

    sed 's/,/\'$'\n''/g' file
    
  • ikincisi, boş bir satır kullanın:

    sed 's/,/\
    /g' file
    
  • Ps. İle ayrılmış aralığa dikkat edin '

  • üçüncü, mac-sed yerine gnu-sed kullanın


7

Tamamlamak için bu da işe yarar:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
Bu, Bash hariç, Gizli C yarışması için de uygun olacaktır;)
Aaron R.

@AaronR. Katılıyorum :-). Kesinlikle trkabul edilen cevap olan çözümü tercih ederim .
ryenus

1
Bu OS X üzerinde çalıştı. Neden bunun \n\ryerine \r\n? \r\nWindows'da gerekli sırayı denedim . Ancak, bunu yaptıktan sonra bir sürü ^Msatırbaşı karakteri bırakıyor vim, bu yüzden sadece olması gerekiyordu \nama \nyalnız çalışmıyor.
NobleUplift

4

Bu gönderiye geç kalmama rağmen, sadece bulgularımı güncelliyorum. Bu cevap yalnızca Mac OS X içindir.

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

Yukarıdaki komutta, çalışmayan yeni satır eklemek için Shift + Enter ile denedim. Bu sefer hatadan da anlaşılacağı gibi "kaçan satırsonu" ndan "kaçmayı" denedim.

$ sed 's/new/\
> /g' m1.json > m2.json 

Yaradı! (Mac OS X 10.9.3'te)


Bu, Max Nanasy'nin sizden iki yıl önce verdiği yanıttan farklı değil.
miken32

2

Sadece açıklığa kavuşturmak için: OSX'teki sed'in man sayfası (10.8; Darwin Çekirdek Sürüm 12.4.0) diyor ki:

[...]

Sed Normal İfadeler

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

bu yüzden tr - yukarıda belirtildiği gibi - veya şık kullanmak zorunda sanırım

sed "s/,/^M
/g"

not: vi düzenleyicide '^ M' almak için < ctrl> -v, < return> yazmanız gerekir


2
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

Mojave'de benim için çalışıyor


1

sedmacOS Mojave 2005 yılında piyasaya sürüldü, bu yüzden bir çözüm gnu-sed,

brew install gnu-sed

sonra kullanmak gsedistediğiniz gibi yapacağız,

gsed 's/,/\n/g' file

İsterseniz sed, sadece sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', hangi tarafından önerilmektedir brew info gnu-sed. Teriminizi yeniden başlatın, ardından sedkomut satırınız gsed.


0

FWIW, aşağıdaki satır pencerelerde çalışır ve yol değişkenlerimdeki noktalı virgülleri bir satırsonu ile değiştirir. Git bin dizinim altında kurulu araçları kullanıyorum.

echo %path% | sed -e $'s/;/\\n/g' | less
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.