Apa arti dari [[: spasi:]] di bash?


23

Saya baru saja menemukan skrip bash. Apa [[:space:]]artinya dalam skrip bash? Mengapa usus ganda?

Jawaban:


35

Memang, dalam manual bash, tetapi membantu untuk mengetahui apa yang Anda cari, yang tidak membantu jika Anda tidak tahu apa yang Anda lihat. Jika Anda mencari, [[Anda akan terganggu oleh bagian [[ expression ]]ekspresi kondisional. Selain itu, mencari :space:tanah Anda dalam dua contoh di bawah bagian yang sama. Anda dapat mengikuti remah roti dalam contoh itu:

Misalnya, berikut ini akan cocok dengan garis (disimpan dalam garis variabel shell) jika ada urutan karakter dalam nilai yang terdiri dari angka apa pun, termasuk nol, karakter spasi, nol atau satu contoh 'a', lalu a 'b':

[[ $line =~ [[:space:]]*?(a)b ]]

... dari mana Anda dapat menyatukan bahwa [[:space:]]bagian tersebut berhubungan dengan "karakter luar angkasa", tetapi Anda dapat dimaafkan jika berpikir bahwa itu hanya karakter ruang literal dan bukan seluruh kelas karakter, yang diwakilinya.

Jika Anda (kebetulan?) Mencari string " space"(yaitu, spasi diikuti oleh kata "spasi") di manual bash online , ada "hanya" sekitar 32 pertandingan yang harus dilalui. Tentang yang kesepuluh akan ada di sini:

Di dalam '[' dan ']', kelas karakter dapat ditentukan menggunakan sintaks [: kelas:], di mana kelas adalah salah satu kelas berikut yang didefinisikan dalam standar POSIX:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

Kelas karakter cocok dengan karakter apa pun yang termasuk kelas itu.

Yang kemudian akan membawa Anda ke standar POSIX di mana Anda dapat mencari istilah "kelas karakter" dan menemukan

wctype, wctype_l - mendefinisikan kelas karakter , yang membuat Anda sejauh:

Fungsi wctype () [CX] [Option Start] dan wctype_l () [Option End] harus menentukan nilai wctype_t sesuai dengan aturan set karakter berkode yang ditentukan oleh informasi jenis karakter di lokal saat ini [CX] [Option Start] atau di lokal yang diwakili oleh lokal, [Opsi Akhir] masing-masing (kategori LC_CTYPE).

Jika kemudian Anda mengikuti tautan setlocale , Anda akhirnya akan mendapatkan jawaban Anda yang sebenarnya, di bagian Lokal :

ruang

Tentukan karakter yang akan diklasifikasikan sebagai karakter spasi-putih. Di lokal POSIX, tepatnya <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>harus dimasukkan.

Dalam file definisi lokal, tidak ada karakter yang ditentukan untuk kata kunci atas, bawah, alfa, digit, grafik, atau xdigit. Set <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>karakter portabel, dan karakter apa pun yang termasuk dalam kelas kosong secara otomatis termasuk dalam kelas ini.


1
Lebih mudah menemukan kecocokan manual dengan LESS=+'/Within \[ and \],' man bashalih - alih 32 nperintah ext :-).
Isaac

5
@Isaac, saya pikir intinya adalah mengajar pria itu cara memancing. Yang mengatakan, saya tidak tahu less +"$cmd", jadi terima kasih untuk itu.
JoL

3
Memang, saya menjawab mengingat perspektif OP; mereka dapat dimaafkan karena tidak memahami bahwa bagian luar itu []tidak tergantung pada bagian dalam []. Saya mencoba (!) Untuk menemukan jalan dari pertanyaan ke jawaban tanpa mengetahui terlalu banyak tentang apa jawabannya, walaupun butuh beberapa tebakan beruntung :)
Jeff Schaller

17

Ini bukan hanya untuk Bash, Ini adalah bagian dari notasi POSIX.

Apa itu POSIX?

POSIX atau "Portable Operating System Interface for uniX" adalah kumpulan standar yang mendefinisikan beberapa fungsi yang harus didukung oleh sistem operasi (UNIX). Salah satu standar ini mendefinisikan dua rasa ekspresi reguler.

Ekspresi Braket POSIX

Ekspresi braket POSIX adalah jenis kelas karakter khusus. Ekspresi braket POSIX mencocokkan satu karakter dari satu set karakter, sama seperti kelas karakter biasa.

POSIX standar

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

Tidak ada Standar

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

sintaks lama (dapatkah seseorang menemukan referensi untuk ini?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

Anda dapat menemukan info lebih lanjut di sini: wiki


1
[[:ascii:]], dan [[:word:]]bukan kelas-kelas POSIX (mereka tampaknya- bashspesifik), dan saya tidak dapat menemukan [[:<:]]atau [[:>:]]keduanya. Referensi yang lebih baik mungkin pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
Ya,, [[:ascii:]]dan [[:word:]]tidak ada kelas POSIX standar. untuk [[:<:]]dan [[:>:]], saya tidak dapat menemukan referensi apa pun, tetapi itu sama \b. en.wikipedia.org/wiki/Regular_expression#Character_classes
Nima

Postgres mendefinisikan penggunaan [[:<:]]dan mengklaim bahwa: Ini adalah ekstensi, kompatibel dengan tetapi tidak ditentukan oleh POSIX 1003.2
Isaac

[[:<:]]juga ada di FreeBSD, dengan peringatan yang sama dengan PostgreSQL: freebsd.org/cgi/…
ilkkachu

1
Dan [[:ascii:]]dan [[:word:]]tentu saja bekerja di Bash dalam pencocokan pola, tetapi tidak dalam ekspresi reguler (setidaknya pada sistem saya, saya pikir Bash menggunakan pustaka regex sistem). Bah
ilkkachu

9

Dalam ekspresi reguler dan nama file gumpalan / pola shell, [...]konstruk tersebut cocok dengan salah satu karakter yang tercantum dalam tanda kurung. Di dalam tanda kurung itu, sejumlah kelas karakter karakter standar dapat digunakan. Salah satunya adalah [:space:], yang cocok dengan karakter spasi putih (seperti \sdi Perl regexes). Lihat misalnya Pencocokan Pola dalam manual Bash

Jadi, [[:space:]]adalah bagian dari persamaan reguler atau kecocokan pola, yang cocok hanya dengan spasi putih.

Misalnya kecocokan pola (shell standar, tidak khusus untuk Bash):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

atau regex (Bash):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

Perhatikan bahwa meskipun ekspresi braket [...]bekerja sama dalam ekspresi reguler dan pola shell, mereka umumnya sangat tidak sama. ( casedan [[ string == pattern ]]gunakan pencocokan pola, [[ string =~ regex ]]gunakan regex.)

Ekspresi reguler juga tidak spesifik untuk shell, mereka digunakan dalam misalnya awkdan sedjuga, dan dijelaskan dalam misalnya halaman manual Linuxregex(7)

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.