Saya mencoba untuk mencetak garis menggunakan simbol pengulangan {n} tetapi tidak berfungsi. Untuk. misal saya ingin mencetak semua baris yang panjangnya 4 char
awk '/^.{4}$/' test_data
Kode di atas tidak mencetak itu. Bagaimana memperbaikinya sehingga saya dapat menggunakan simbol pengulangan? Saya tahu alternatif suka awk '/^....$/' test_data
danawk 'length ==3 ' test_data
awk
regular-expression
Pembelajar Selamanya
sumber
sumber
awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo'
untuk mencocokkan tepat 4 karakter. Juga seperti yang Anda sebutkan,awk 'length($0) == 4' test_data
kompatibel dengan hampir semuaawk
versi.awk --re-interval '/^.{4}$/' test_data
atauawk --posix '/^.{4}$/' test_data
bekerja?Jawaban:
Menurut Panduan Pengguna Awk GNU: Riwayat Fitur , dukungan untuk operator rentang ekspresi reguler ditambahkan dalam versi 3.0 tetapi pada awalnya diperlukan opsi baris perintah eksplisit
Opsi baris perintah baru:
Di
gawk
4.0,Karena Anda menggunakan
gawk
3.x, Anda harus menggunakanatau
atau (terima kasih @ StéphaneChazelas) jika Anda menginginkan solusi yang portabel, gunakan
(karena
--posix
atau--re-interval
akan menyebabkan kesalahan dalamawk
implementasi lain ).sumber
POSIXLY_CORRECT=anything awk '/^.{4}/'
karena membuat kode portabel (--posix
atau--re-interval
akan menyebabkan kesalahan dalamawk
implementasi lain ).EREs ( ekspresi reguler yang diperluas seperti yang digunakan oleh
awk
atauegrep
) pada awalnya tidak dimiliki{x,y}
. Ini pertama kali diperkenalkan di BREs (seperti yang digunakan olehgrep
ataused
), tetapi dengan\{x,y\}
sintaks yang tidak merusak portabilitas mundur.Tetapi ketika itu ditambahkan ke EREs dengan
{x,y}
sintaks itu, itu benar-benar menghancurkan portabilitas karenafoo{2}
RE cocok dengan sesuatu yang berbeda sebelumnya.Jadi beberapa implementasi memilih untuk tidak melakukannya. Anda akan menemukan itu
/bin/awk
,/bin/nawk
dan/bin/egrep
pada Solaris masih tidak menghormatinya (Anda perlu menggunakan/usr/xpg4/bin/awk
atau/usr/xpg4/bin/grep -E
). Sama untukawk
dannawk
di FreeBSD (berdasarkan pada yangawk
dikelola oleh Brian Kernighan (k
dalamawk
)).Untuk GNU
awk
, hingga yang relatif baru (versi 4.0), Anda harus memanggilnyaPOSIXLY_CORRECT=anything awk '/^.{4}$/'
untuk menghormatinya.mawk
masih tidak menghormatinya .Perhatikan bahwa operator itu hanya gula sintaksis.
.{3,5}
dapat selalu ditulis....?.?
misalnya (meskipun tentu saja{3,5}
jauh lebih terbaca, dan setara(foo.{5,9}bar){123,456}
akan jauh lebih buruk).sumber
Ini berfungsi seperti yang diharapkan dengan GNU
awk
(gawk):Tetapi gagal dengan
mawk
yang lebih dekat dengan POSIXawk
dan, AFAIK, adalah default pada sistem Ubuntu:Jadi, solusi sederhana akan menggunakan
gawk
bukanawk
. The{n}
notasi bukan bagian dari sintaks POSIX BRE (ekspresi reguler dasar). Itu sebabnyagrep
juga gagal di sini:Namun, itu adalah bagian dari ERE (ekspresi reguler yang diperluas):
Saya tidak tahu rasa regex mana yang digunakan oleh. Mereka menggunakan versi ERE yang lebih lama sesuai dengan jawaban Stéphane . Bagaimanapun, Anda tampaknya menggunakan versimawk
atau POSIXawk
, tapi saya rasa itu BREawk
yang tidak menerapkan ERE atau input Anda sebenarnya tidak memiliki garis dengan tepat 4 karakter. Ini bisa terjadi karena spasi putih yang tidak Anda lihat atau hapus kode mesin terbang, misalnya.sumber
length($0)
yang lebih efisien daripada regex.mawk
tidak terlalu dekat dengan POSIXawk
, dan tidak menggunakan BRE. Itu memang menggunakan ERE tetapi tanpa{x,y}
operator.