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
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
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 ...
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.
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.
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
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.
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.
tr , '\n'
. Saya kira, sed memperlakukan\n
sebagai teks biasa.tr , '\n' < file
- tidak ada pipa.g
bagian akhir naskah? Saya mendapatkan perilaku yang sama tanpa itu.Jawaban:
Gunakan
tr
sebaliknya:sumber
tr ',' ';' < input.csv > output.csv
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\n
dengan baris baru yang nyata, tetapi kemudian Anda harus menggandakan backslash yang sed akan melihat untuk melarikan diri dari baris baru, misalnyaPerhatikan ini tidak akan bekerja pada semua shell , tetapi akan bekerja pada yang paling umum.
sumber
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
tidak perlu menginstal gnu-sed-e
sepertinya tidak perlu.bekerja di Mac OS X.
sumber
Jika penggunaan sed Anda cenderung sepenuhnya ekspresi substitusi (seperti saya cenderung), Anda juga dapat menggunakan
perl -pe
sebagai gantinyasumber
Tampaknya
\r
kuncinya!Mengubah ini:
Untuk ini:
sumber
\r
ini tidak sama dengan\n
, dan ini dapat merusak manipulasi dan penggunaan data lebih lanjut.\r
!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) ...
... di mana
^J
dilakukan 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 ...
sumber
MacOS berbeda, ada dua cara untuk mengatasi masalah ini dengan sed in mac
pertama, gunakan
\'$'\n''
ganti\n
, itu bisa bekerja di MacOS:yang kedua, cukup gunakan baris kosong:
Ps. Perhatikan rentang yang dipisahkan oleh
'
yang ketiga, gunakan gnu-sed ganti mac-sed
sumber
Untuk membuatnya lengkap, ini juga berfungsi:
sumber
tr
solusinya, yang sudah menjadi jawaban yang diterima.\n\r
bukan\r\n
? Saya mencoba\r\n
yang merupakan urutan yang diperlukan pada Windows. Namun, setelah saya melakukan ini, ia meninggalkan banyak^M
karakter carriage returnvim
, jadi saya pikir itu seharusnya hanya\n
tetapi\n
sendirian tidak berfungsi.Meskipun saya terlambat untuk posting ini, hanya memperbarui temuan saya. Jawaban ini hanya untuk Mac OS X.
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.
Bekerja! (di Mac OS X 10.9.3)
sumber
Sekedar klarifikasi: halaman manual sed pada OSX (10.8; Darwin Kernel Versi 12.4.0) mengatakan:
[...]
Sed Regular Expressions
[...]
jadi saya kira kita harus menggunakan tr - seperti yang disebutkan di atas - atau yang bagus
Catatan: Anda harus mengetikkan < ctrl> -v, < return> untuk mendapatkan '^ M' di vi editor
sumber
...
Bekerja untukku di Mojave
sumber
sed
pada macOS Mojave dirilis pada tahun 2005, jadi salah satu solusinya adalah dengan menginstalgnu-sed
,maka gunakan
gsed
akan melakukan apa yang Anda inginkan,Jika Anda suka
sed
, adilsudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, yang disarankan olehbrew info gnu-sed
. Mulai ulang istilah Anda, kemudiansed
baris perintah Anda adalahgsed
.sumber
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.
sumber