Saya baru saja menemukan skrip bash. Apa [[:space:]]
artinya dalam skrip bash? Mengapa usus ganda?
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.
LESS=+'/Within \[ and \],' man bash
alih - alih 32n
perintah ext :-).less +"$cmd"
, jadi terima kasih untuk 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 :)Ini bukan hanya untuk Bash, Ini adalah bagian dari notasi POSIX.
Apa itu POSIX?
Ekspresi Braket POSIX
POSIX standar
Tidak ada Standar
sintaks lama (dapatkah seseorang menemukan referensi untuk ini?)
Anda dapat menemukan info lebih lanjut di sini: wiki
sumber
[[:ascii:]]
, dan[[:word:]]
bukan kelas-kelas POSIX (mereka tampaknya-bash
spesifik), dan saya tidak dapat menemukan[[:<:]]
atau[[:>:]]
keduanya. Referensi yang lebih baik mungkin pubs.opengroup.org/onlinepubs/9699919799/basedefs/…[[: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[[:<:]]
dan mengklaim bahwa: Ini adalah ekstensi, kompatibel dengan tetapi tidak ditentukan oleh POSIX 1003.2[[:<:]]
juga ada di FreeBSD, dengan peringatan yang sama dengan PostgreSQL: freebsd.org/cgi/…[[: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). BahDalam 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\s
di Perl regexes). Lihat misalnya Pencocokan Pola dalam manual BashJadi,
[[:space:]]
adalah bagian dari persamaan reguler atau kecocokan pola, yang cocok hanya dengan spasi putih.Misalnya kecocokan pola (shell standar, tidak khusus untuk Bash):
atau regex (Bash):
Perhatikan bahwa meskipun ekspresi braket
[...]
bekerja sama dalam ekspresi reguler dan pola shell, mereka umumnya sangat tidak sama. (case
dan[[ string == pattern ]]
gunakan pencocokan pola,[[ string =~ regex ]]
gunakan regex.)Ekspresi reguler juga tidak spesifik untuk shell, mereka digunakan dalam misalnya
awk
dansed
juga, dan dijelaskan dalam misalnya halaman manual Linuxregex(7)
sumber