Ganti koma dengan baris baru dalam pada MacOS?

286

Saya memiliki file id yang dipisahkan koma. Saya mencoba mengganti koma dengan baris baru. Saya sudah mencoba:

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

tetapi tidak berhasil. Apa yang saya lewatkan?

WildBill
sumber
12
coba tr , '\n'. Saya kira, sed memperlakukan \nsebagai teks biasa.
Pangeran John Wesley
1
Itu berhasil! file kucing | tr, '\ n'
WildBill
7
tr , '\n' < file- tidak ada pipa.
Pangeran John Wesley
Untuk apa gbagian akhir naskah? Saya mendapatkan perilaku yang sama tanpa itu.
HelloGoodbye
Shell apa yang Anda gunakan? Ini berfungsi untuk saya, menggunakan bash shell.
HelloGoodbye

Jawaban:

361

Gunakan trsebaliknya:

tr , '\n' < file
Pangeran John Wesley
sumber
saya sedang mencari untuk mengganti '.' titik, dan ini adalah solusi yang saya cari :)
Jonah
1
Ini bukan wokring dalam bash shell $ tr, '\ n' aitr penggunaan: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Pelajar
5
Mengganti koma dengan titik koma juga berfungsi:tr ',' ';' < input.csv > output.csv
Wim Deblauwe
304

Gunakan string ANSI-C yang dikutip $'string'

Anda perlu baris baru literasi yang lolos dari garis miring terbalik untuk sampai ke sed. Dalam bash setidaknya, $''string akan diganti \ndengan baris baru yang nyata, tetapi kemudian Anda harus menggandakan backslash yang sed akan melihat untuk melarikan diri dari baris baru, misalnya

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

Perhatikan ini tidak akan bekerja pada semua shell , tetapi akan bekerja pada yang paling umum.

Walter Mundt
sumber
5
aneh, itu juga bekerja dengan satu backslash yaitu kurang echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly
2
Terpilih. Untuk info lebih lanjut lihat bagian "QUOTING" dari man bash.
tboyce12
7
Sudah bekerja dengan OSX 10.11:, sed -E $'s/<\\/br>/\\\n/g' filetidak perlu menginstal gnu-sed
Brice
2
Diverifikasi bekerja pada OS X 10.7 dengan contoh yang diberikan. Bagian itu -esepertinya tidak perlu.
Yongwei Wu
1
contoh dalam jawaban segera bekerja untuk saya di OSX 10.11.5
Roelofs
122
sed 's/,/\
/g'

bekerja di Mac OS X.

Max Nanasy
sumber
3
Terima kasih untuk ini - Ingin tahu mengapa trik linux lama saya tidak berfungsi di OSX. Tapi ini benar!
Wyatt8740
6
Ini adalah satu-satunya solusi yang bekerja dalam skrip sed.
Firstrock
6
Perhatikan bahwa backslash lolos dari baris literal (sehingga bukan terminator perintah): ini bukan karakter kelanjutan baris (seperti dalam bash, dll.). Untuk melihat perbedaannya, cobalah untuk menulis perintah di atas tanpa tanda kutip: garis miring terbalik akan ditafsirkan oleh shell sebagai karakter kelanjutan garis dan itu dan baris baru akan dibuang. Sebaliknya, sertakan isi dari ekspresi yang dikutip (tanpa tanda kutip) dalam file comma-to-newline.sed yang terpisah (yang menghilangkan sintaksis shell), dan itu berfungsi!
Nils von Barth
1
ini bagus karena dapat menggantikan apa saja, bukan karakter. tr tampaknya hanya bekerja dengan karakter. jika Anda meletakkan string sebagai parameter pertama, itu akan menggantikan semua kemunculan karakter, bukan string.
Shawn
1
@Dogog Apakah Anda menggunakan bash, sh, atau shell yang berbeda? Apakah Anda yakin menggunakan tanda kutip tunggal dan bukan tanda kutip ganda?
Max Nanasy
22

Jika penggunaan sed Anda cenderung sepenuhnya ekspresi substitusi (seperti saya cenderung), Anda juga dapat menggunakan perl -pesebagai gantinya

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

Tampaknya \r kuncinya!

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

Mengubah ini:

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

Untuk ini:

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
Chris Seymour
sumber
Saya tahu pertanyaannya mengatakan OS X, tetapi ini tidak bekerja dengan GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu
10
Perlu diingat bahwa \rini tidak sama dengan \n, dan ini dapat merusak manipulasi dan penggunaan data lebih lanjut.
Joel Purra
3
Maaf, ini tidak berhasil untuk saya. Saya baru saja mendapat 'r' di mana seharusnya ada baris baru.
Frank de Groot - Schouten
Anda harus membuatnya lebih jelas dalam jawaban yang diberikan ini \r!
pir
Itu bekerja untuk saya tetapi saya heran mengapa! \ n adalah standar pada unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex
15

Ini berfungsi pada MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) dan RHE Linux (Red Hat Enterprise Linux Server rilis 5.3, Tikanga) ...

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

... di mana ^Jdilakukan dengan melakukan ctrl+ v+ j. Jangan pedulikan \sebelum ^J.

PS, saya tahu sed di RHEL adalah GNU, sed MacOS adalah berbasis FreeBSD, dan meskipun saya tidak yakin tentang sed Solaris, saya percaya ini akan bekerja cukup banyak dengan sed. YMMV ...

Ramon Rey
sumber
12

MacOS berbeda, ada dua cara untuk mengatasi masalah ini dengan sed in mac

  • pertama, gunakan \'$'\n''ganti \n, itu bisa bekerja di MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • yang kedua, cukup gunakan baris kosong:

    sed 's/,/\
    /g' file
    
  • Ps. Perhatikan rentang yang dipisahkan oleh '

  • yang ketiga, gunakan gnu-sed ganti mac-sed

Cnetwork
sumber
7

Untuk membuatnya lengkap, ini juga berfungsi:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
Ryenus
sumber
1
Ini juga cocok untuk kontes C yang dikaburkan, kecuali Bash;)
Aaron R.
@ Harr. Saya setuju :-). Tentunya saya lebih suka trsolusinya, yang sudah menjadi jawaban yang diterima.
ryenus
1
Ini bekerja pada OS X. Mengapa \n\rbukan \r\n? Saya mencoba \r\nyang merupakan urutan yang diperlukan pada Windows. Namun, setelah saya melakukan ini, ia meninggalkan banyak ^Mkarakter carriage return vim, jadi saya pikir itu seharusnya hanya \ntetapi \nsendirian tidak berfungsi.
NobleUplift
4

Meskipun saya terlambat untuk posting ini, hanya memperbarui temuan saya. Jawaban ini hanya untuk Mac OS X.

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

Pada perintah di atas saya mencoba dengan Shift + Enter untuk menambahkan baris baru yang tidak berfungsi. Jadi kali ini saya mencoba dengan "melarikan diri" the "unescaped newline" sebagaimana diceritakan oleh kesalahan.

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

Bekerja! (di Mac OS X 10.9.3)

pengguna2300875
sumber
Ini tidak berbeda dengan jawaban Max Nanasy dua tahun sebelum jawaban Anda.
miken32
2

Sekedar klarifikasi: halaman manual sed pada OSX (10.8; Darwin Kernel Versi 12.4.0) mengatakan:

[...]

Sed Regular Expressions

 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.

[...]

jadi saya kira kita harus menggunakan tr - seperti yang disebutkan di atas - atau yang bagus

sed "s/,/^M
/g"

Catatan: Anda harus mengetikkan < ctrl> -v, < return> untuk mendapatkan '^ M' di vi editor

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

...

Bekerja untukku di Mojave

Paulo Henrique Lellis Gonalves
sumber
1

sedpada macOS Mojave dirilis pada tahun 2005, jadi salah satu solusinya adalah dengan menginstal gnu-sed,

brew install gnu-sed

maka gunakan gsedakan melakukan apa yang Anda inginkan,

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

Jika Anda suka sed, adil sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', yang disarankan oleh brew info gnu-sed. Mulai ulang istilah Anda, kemudian sedbaris perintah Anda adalah gsed.

DawnSong
sumber
0

FWIW, baris berikut berfungsi di windows dan mengganti titik koma di variabel path saya dengan baris baru. Saya menggunakan alat yang diinstal di bawah direktori git bin saya.

echo %path% | sed -e $'s/;/\\n/g' | less
Jeff LaFay
sumber