GNU/Linux >> Belajar Linux >  >> Linux

Pisahkan Karakter Individu Menggunakan String Null?

Saya membaca ini di manual Gawk:

EKSTENSI GNU

[…]

Kemampuan untuk memisahkan karakter individu menggunakan string null sebagai
nilai FS, dan sebagai argumen ketiga untuk split().

Namun hal ini tampaknya tidak terjadi. Ini berfungsi seperti yang diharapkan:

$ gawk 'BEGIN {print split("quebec", z, "")}'
6

dan saya dapat menonaktifkan ekstensi lain:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined

tapi saya tidak bisa menonaktifkan perilaku split:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6

$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6

Saya juga melihat manual Mawk:

Jika FS =“”, maka mawk memecah record menjadi karakter-karakter individual, dan,
demikian pula, split(s,A,””) menempatkan karakter-karakter individual dari s ke dalam A.

[…]

Posix secara eksplisit membiarkan perilaku FS =“” tidak terdefinisi, dan menyebutkan
memecah record menjadi karakter sebagai interpretasi yang mungkin, tetapi
saat ini penggunaan ini tidak portabel di seluruh implementasi.

Jadi, dengan implementasi apa Anda tidak bisa mendapatkan karakter tunggal dengan FS dan
split ?

Jawaban yang Diterima:

Itu bukan POSIX karena Anda tidak dapat menggunakannya dalam skrip POSIX karena POSIX membiarkan perilaku tidak ditentukan . Itu berarti bahwa sementara aplikasi (skrip) tidak dapat menggunakannya jika ingin portabel, implementasi (sebuah awk implementasi) dapat melakukan apa pun yang diinginkannya jika Anda melakukannya dan masih menjadi POSIX. POSIX tidak memerlukan awk untuk membagi menjadi karakter atau byte, atau melaporkan kesalahan, atau mem-boot ulang komputer, komputer tidak akan ditentukan.

Jadi gawk tidak memiliki alasan untuk mengubah perilakunya dalam hal itu ketika $POSIXLY_CORRECT ada di lingkungan¹, tidak ada perilaku yang lebih benar secara POSIX daripada yang lain dalam contoh tersebut.

Seperti yang Anda ketahui, ekstensi itu ditemukan di gawk (sejak 3.0, Januari 1996) dan mawk (sejak versi 1.2, Januari 1996). Itu juga di busybox awk (sejak awal (2002), dan sejak Mei 1996 juga dikelola oleh Brian Kernighan (the k di awk ) (FIXES file mengacu pada gawk , dll. sebagai inspirasi). Sepertinya itu ditambahkan ke semua 3 dalam beberapa bulan menunjukkan mungkin itu dibahas di antara pengelola mereka. Saya tidak begitu yakin sekarang siapa yang pertama kali mendapatkan ide.

Dengan awk Brian Kernighan atau yang didasarkan pada itu seperti pada FreeBSD atau OpenBSD, perhatikan bahwa saat FS kosong atau argumen ketiga kosong diteruskan ke split() menyebabkan string dipecah menjadi karakter individualnya (well, byte , lihat di bawah), awk -F '' mengembalikan kesalahan (awk -v FS= tidak apa-apa).

Terkait:Ubah genotipe menjadi 0/1?

Di Solaris, dengan keduanya nawk dan /usr/xpg4/bin/awk (dan juga /bin/awk yang lama dari tahun 70-an), FS empty yang kosong tampaknya menonaktifkan pemisahan sama sekali. nawk -F '' mengembalikan kesalahan. Saya berharap itu akan sama pada Unices komersial lainnya berdasarkan kode AT&T seperti AIX atau HP/UX, meskipun saya tidak dapat mengujinya di sana.

Perhatikan juga bahwa mawk , awk bwk ini (itu berbeda untuk beberapa berbasis di atasnya) dan busybox awk tidak mendukung karakter multibyte. Jadi misalnya, dalam UTF-8:

echo Stéphane | awk -v FS= '{print $4}'

akan mencetak paruh kedua karakter ketiga dalam nama depan saya. Jadi dengan itu, lebih tepat untuk mengatakan bahwa FS kosong dipecah menjadi byte individual, bukan karakter.

Sekarang saya menyadari bahwa dengan POSIXLY_CORRECT, atau --posix , gawk menonaktifkan beberapa ekstensi yang tidak bertentangan dengan POSIX (typeof memang membuat gawk tidak patuh), jadi Anda bisa mengatakan itu kelalaian. Sekarang itu tidak akan menjadi yang pertama. Misalnya, itu tidak menonaktifkan nextfile meskipun bertentangan dengan POSIX (awk '{nextfile = 1}' dimaksudkan untuk menetapkan 1 ke nextfile variabel tetapi melaporkan kesalahan dalam gawk bahkan di bawah POSIXLY_CORRECT).


Linux
  1. Memecahkan masalah menggunakan sistem file proc di Linux

  2. Perintah Untuk Mencetak Hanya 3 Karakter Terakhir Dari Sebuah String?

  3. Menggunakan –exclude Dengan Perintah Du?

  1. Cara Memisahkan String dalam Skrip Bash

  2. Dapatkan 4 karakter keluaran terakhir dari keluaran standar

  3. Linux:cari tahu proses apa yang menggunakan semua RAM?

  1. Menghitung Karakter Setiap Baris Dengan Wc?

  2. Bagaimana cara mengetahui apa yang menghabiskan semua ruang di partisi / saya?

  3. Bagaimana cara mengetahui antarmuka mana yang saya gunakan untuk terhubung ke internet?