GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengganti Semua Titik Koma Setelah Yang Pertama?

Masalah ini terkait dengan upaya saya untuk mengimpor pertanyaan dan jawabannya dalam file Excel ke file .txt - yang ditangani oleh program kartu flash Anki seperti yang dijelaskan di sini.
Saya tidak dapat memiliki lebih dari 2 bidang jadi saya perlu membuat opsi satu bidang .

Data disimpan sebagai CSV dari LibreOffice (titik koma sebagai pemisah bidang – hanya membedakan apa yang dikatakan manual) seperti yang diinstruksikan dalam manual Anki

Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
...

di mana setiap entri dengan semua opsi berada dalam satu baris yaitu satu "kartu flash". Dalam satu kartu, bagian depan sebelum titik koma, dan bagian belakang setelah titik koma. Kartu flash kedua di baris baru dan seterusnya.

Output yang diinginkan yang harus dalam UTF-8

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
...

Kodesemu saya di Perl berdasarkan jawaban ini

perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file

Dikomentari

perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    s/;/\0/;    # turn the first semicolon into a null byte
    s/;/ |/g;     # replace all other semicolons with " |"
    s/\0/;/     # restore the first semicolon
' file

Bagaimana cara mengganti semua titik koma setelah titik koma pertama?

Jawaban yang Diterima:

sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN

Perhatikan bahwa ini tidak gunakan regexp untuk menangani sebagian besar penggantian, tetapi gunakan (dan jauh lebih berkinerja) yang lebih mendasar terjemahan berfungsi untuk melakukannya – dan melakukannya dengan cara portabel POSIX. Ini harus bekerja pada mesin apa pun dengan POSIX sed terpasang.

Ini menerjemahkan ; titik koma ke | pipa dan | pipa ke \n ewline secara bersamaan. | pipa disisihkan sebagai \n ewlines jika terjadi pada jalur input. Kemudian s/// menggantikan | . yang muncul pertama kali pipa untuk ; titik koma, lalu terjemahkan semua \n baris ke | pipa – dengan demikian memulihkan semua yang mungkin telah disisihkan untuk menangani s/// . tunggal dengan kuat substitusi.

Sementara saya menggunakan <<\IN di sini-dokumen demi demonstrasi salin/tempel, Anda mungkin harus menggunakan <infile >outfile .

OUTPUT:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

Linux
  1. Bagaimana Cara Mengganti String Dalam File?

  2. Bagaimana Mengganti Satu Char Dengan Yang Lain Di Semua Nama File Direktori Saat Ini?

  3. Cara mendaftar semua pengguna yang masuk

  1. Bagaimana cara memindahkan (dan menimpa) semua file dari satu direktori ke direktori lain?

  2. Cara menghapus semua wadah Docker

  3. Bagaimana cara mengganti beberapa spasi dengan satu tab

  1. Bagaimana cara mengganti semua isi dari satu folder dengan yang lain

  2. Bagaimana cara mengubah semua utas (dan anak-anak) dari satu proses di Linux?

  3. Cara menonaktifkan satu CPU