awk regexp cocok hanya pada satu tab

Saya memiliki file input sederhana untuk awk, bernama tabmatch.input dan dengan konten di bawah ini:

        : (test1
            : (test2

Baris pertama memiliki satu tab, lalu ":", dan baris kedua memiliki dua tab, lalu ":". Kata "test1" dan "test2" bisa berupa kata apa saja di file sebenarnya yang saya coba urai.

Saya mencoba membuat regexp yang cocok dengan baris pertama, tetapi tidak dengan baris kedua. Misalnya saya mencoba ini:

user@lab-client:~$ cat tabmatch.input |awk '/\t: \(test/ {  {print $2} }'
(test1
(test2

Meskipun hanya menentukan satu \t dan kemudian ":", tetap cocok dengan dua \t dan ":". Jika saya mencocokkan dua \t, itu hanya cocok dengan baris kedua yang memiliki dua \t.

user@lab-client:~$ cat tabmatch.input |awk '/\t\t: \(test/ {  {print $2} }'
(test2

Saya telah melihat-lihat tetapi tidak menemukan mengapa \t cocok dengan beberapa \t, atau bagaimana membuatnya hanya cocok dengan satu.

Upaya lain yang saya lakukan adalah:

user@lab-client:~$ cat tabmatch.input |awk '/[\t]: \(test/ {  {print $2} }'
(test1
(test2

user@lab-client:~$ cat tabmatch.input |awk '/[\t]?: \(test/ {  {print $2} }'
(test1
(test2

awk
person Johnathan    schedule 11.10.2016    source sumber


Jawaban (1)


Kedua garis Anda cocok dengan polanya.

Jika Anda hanya ingin mencocokkan satu tab dari awal baris, maka Anda perlu menambahkan jangkar ^:

awk '/^\t: \(test/ { print $2 }' tabmatch.input

Saya menghapus kurung kurawal bagian dalam karena tidak ada gunanya.

Ingatlah bahwa awk dapat membaca file dengan sendirinya sehingga Anda tidak perlu menyalurkan data ke file tersebut menggunakan cat.

person Tom Fenech    schedule 11.10.2016
comment
Haha, saat kamu mengatakannya tiba-tiba menjadi masuk akal. Saya tidak tahu bagaimana saya tidak memikirkan hal itu. Terima kasih! Akan menandai jawaban Anda sebagai oke dalam 10 menit jika memungkinkan. - person Johnathan; 11.10.2016