Cara menghapus karakter tertentu dalam sebuah string tetapi hanya jika tidak ada angka di baris itu di Linux

8

Saya bingung dengan masalah yang tampaknya mudah diperbaiki ini ... well, untuk sementara waktu.

Berikut ini contoh keluaran dari file yang perlu saya edit:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Saya perlu menghapus spasi antara "George Washington" dan "Konvensi Jenewa", tetapi bukan spasi antara "123.281.029 USD" atau "342.019.929 EUR".

Pada dasarnya, tujuan saya di sini adalah untuk hanya menghapus spasi antara kata-kata dalam satu baris SAJA jika tidak ada angka di baris itu.

Saya sudah mencoba mengedit file melalui grep -v [0-9] $file | sed 's/ //', tetapi satu-satunya cara yang akan berhasil adalah jika saya output ke file lain, tetapi itu berarti mengecualikan semua baris dengan angka dari file lama ke file baru, yang bukan yang saya butuhkan ..

Saya sudah mencoba beberapa loop yang cukup konyol dengan grep dan sedtetapi sepertinya tidak ada yang berhasil.

Sekali lagi, ini adalah contoh output dari file:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Inilah output yang saya inginkan:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR
pengguna62129
sumber

Jawaban:

15

Menggunakan sed:

sed '/[0-9]/!s/ //g' filename

Ini akan menghapus spasi pada semua baris yang tidak mengandung angka.

Menggunakan awk:

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

Untuk menghapus spasi hanya antara dua kata pertama (di sini menggunakan GNU seduntuk -r, gunakan -Esebagai gantinya pada BSD):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename
devnull
sumber
Sempurna! Ini persis apa yang saya cari! Tidak dapat menemukan sintaksis di mana pun untuk bagian "/ [0-9] /! S /". Terima kasih banyak.
user62129
@ user62129 - jika jawaban ini menyelesaikan masalah Anda, silakan luangkan waktu sebentar dan periksa tanda centang di bawah penghitungan suara di sebelah kiri, ini akan menandakan kepada semua orang bahwa masalah Anda telah diselesaikan.
slm
7

Menggunakan perl:

perl -ple 's/\s+//g unless /\d/' file
cuonglm
sumber
4

Untuk pendekatan yang lebih umum, hapus hanya spasi yang berada di antara dua huruf. Dengan begitu ia dapat bekerja bahkan jika garis memiliki angka, itu hanya mengabaikan spasi di sekitar angka:

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

Sebagai contoh, itu akan berubah George and Harry 12 EURmenjadi GerogeandHArry 12 EURdan masih berfungsi dengan benar untuk kasus-kasus dalam contoh Anda.

terdon
sumber