Jawaban:
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 +"$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?
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
[[: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). Bah
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 \s
di 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. ( case
dan [[ string == pattern ]]
gunakan pencocokan pola, [[ string =~ regex ]]
gunakan regex.)
Ekspresi reguler juga tidak spesifik untuk shell, mereka digunakan dalam misalnya awk
dan sed
juga, dan dijelaskan dalam misalnya halaman manual Linuxregex(7)
LESS=+'/Within \[ and \],' man bash
alih - alih 32n
perintah ext :-).