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

@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.


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.