ganti ke-n kemunculan string di setiap baris file teks


15

Saya memiliki file teks besar dengan string dibatasi ruang (2-5). String dapat berisi "'" atau "-". Saya ingin mengganti katakanlah ruang kedua dengan pipa.

Apa cara terbaik untuk pergi?

Menggunakan sed saya memikirkan ini:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Ada ide lain / lebih baik / lebih sederhana?

Jawaban:


22

Anda dapat menambahkan nomor di akhir perintah pengganti. Misalnya, berikut ini akan menggantikan kemunculan kedua olddengan string newpada setiap baris file:

sed 's/old/new/2' file

Jadi, alih-alih solusi yang Anda usulkan, Anda dapat menggunakan:

sed 's/ /|/2'

Untuk informasi lebih lanjut, lihat mis tutorial sed ini .


2
Dari sedfile info: "Catatan: standar POSIX tidak menentukan apa yang harus terjadi ketika Anda mencampur g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across implementasi sed. Untuk GNU` sed ', interaksi didefinisikan sebagai: abaikan kecocokan sebelum NUMBER, dan kemudian cocokkan dan ganti semua cocok dari NUMBERth pada. "
Dijeda sampai pemberitahuan lebih lanjut.

File info ... Saya benci mereka. Lagi pula, saya menghapus bagian ambigu. Komentar bagus, +1.
mrucci

1
Terima kasih, mrucci dan Dennis. Saya pikir pasti ada sesuatu yang sederhana di luar sana.
dnkb

Tampaknya setiap masalah yang saya miliki dengan manipulasi teks, saya berhasil menyelesaikannya sed. Saya tidak yakin saya harus berterima kasih kepada Anda karena telah membuat saya sedlebih berguna, tetapi saya tetap akan melakukannya. ;)
Jamie

1

Apakah Anda mencoba versinya? Apa itu bekerja? Karena saya pikir pada dasarnya ide yang bagus. Saya akan melakukan sedikit berbeda, meskipun:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Ini akan menerima karakter apa pun dalam kata yang bukan spasi, dan akan menerima lebih dari satu spasi di antara dua kata pertama.

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.