Ganti semua kemunculan dua spasi setelah akhir kalimat hanya dengan satu spasi

9

Saya terjebak dalam memasukkan ekspresi reguler dengan perintah sed.

T: Saya ingin mengganti semua kemunculan dua spasi setelah akhir kalimat dengan hanya satu kali spasi.

Inilah yang saya lakukan:

sed 's/^ $/^$/' file  

Dan itu tidak menggantikan dua spasi dengan satu spasi setelah kalimat berakhir.

Output yang saya dapatkan:

This is the output.  Hello Hello

Output yang saya inginkan:

This is the output. Hello Hello
Zeus
sumber
@Rahul Saya ingin keluaran dengan yang berisi spasi sekali setelah kalimat berakhir. Bukan dua spasi seperti pada kalimat pertama. Saya ingin hasil kalimat kedua
Zeus
Jawaban oleh @Jasen benar. BTW, perintah yang Anda coba berarti: Ganti baris yang hanya terdiri dari spasi tunggal dengan baris kosong. Inilah sebabnya mengapa itu tidak melakukan apa yang Anda inginkan.
rexkogitans
1
Masukkan di sini: war on single vs double space setelah berhenti penuh
gerrit
@gerrit. Perang itu hilang sekitar 20 tahun yang lalu. ;)
h4ckNinja

Jawaban:

12
 sed 's/\.   */. /g' < file

ganti dot diikuti oleh dua spasi atau lebih dengan dot diikuti oleh satu spasi.

Jasen
sumber
Perintah Anda sebenarnya berfungsi untuk seluruh paragraf. Itulah yang saya inginkan. Terima kasih!
Zeus
atau sed -r 's/\.\s+/. /g' filedengan GNU sed ...
Sundeep
@ Penggunaan dasar sed -Edaripada sed -r. Itu bekerja dengan sed GNU dan sed * BSD (termasuk. Mac OS X) dan beberapa lainnya. Ini dijadwalkan untuk dimasukkan sebagai standar dalam POSIX "segera nyata sekarang".
cas
@cas Saya ingat suatu saat kembali, saya menyarankan sed -Ekepada seseorang di situs ini yang tidak berfungsi tetapi sed -rberfungsi .. Saya telah bekerja dengan GNU sed saja, jadi tidak ada ide tentang POSIX dan variasi lain .. akan mencoba untuk memasukkan detail ini di masa depan , terima kasih :)
Sundeep
Itu pasti versi lama GNU. Mereka telah mendukung -Ecukup lama sekarang (sejak setidaknya 2011, tetapi pria dan halaman info masih hanya menyebutkan -r)
cas
13

sedPerintah Anda 's/^ $/^$/'tidak akan melakukan apa yang Anda inginkan. Itu hanya mengganti semua baris berisi satu spasi dengan baris berisi ^$.

Bergantung pada karakter apa yang menandai akhir kalimat, Anda dapat melakukan:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Ini akan menggantikan 2 ruang atau lebih setelahnya ., ?atau !dengan satu ruang saja.

cuonglm
sumber
1
dapat disingkat menjadised -r 's/([.?!])\s+/\1 /g' file
Sundeep
Terima kasih. Tapi bisakah Anda menjelaskan mengapa begitu banyak kurung bundar yang Anda gunakan? Agak membingungkan.
Zeus
1
@spasic: Itu berfungsi hanya dengan sed GNU, diperbarui dengan versi yang disederhanakan.
cuonglm
@ Zeus: Itu sintaks standar dengan BRE default.
cuonglm
1
Tidak, sedskrip pengeditan asli akan menggantikan baris apa pun yang berisi spasi tunggal dengan string literal ^$.
Kusalananda
7

Ini yang mungkin Anda cari,

tr -s " " <filename

Sampel,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Menggunakan sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello
Rahul
sumber
2
Yah, itu berhasil, terima kasih, tapi aku harus memasukkan perintah sed. Mohon katakan sesuatu yang mirip dengan yang ditunjukkan di atas, seperti substitusi, ubah teks dll di sed.
Zeus
2
Saya tidak mengetahui fitur tr ini,
Jasen
3
Pendekatan ini akan menggantikan dua ruang yang juga bukan merupakan akhir kalimat.
cuonglm