Ketika saya mencari tab dalam file dengan (e) grep saya menggunakan tab litteral ( ^v + <tab>
). Saya tidak dapat menggunakan \t
sebagai pengganti tab dalam ekspresi reguler. Dengan mis. Ungkapan ini bekerja dengan sangat baik.
Jadi apakah ada kemungkinan untuk menggunakan pengganti non-litteral untuk <tab>
dan apa latar belakang untuk tidak bekerja / tidak ditafsirkan \t
?
bash
grep
regex
posix-compliant
Lasall
sumber
sumber
Jawaban:
grep menggunakan ekspresi reguler seperti yang didefinisikan oleh POSIX . Untuk alasan apa pun POSIX belum didefinisikan
\t
sebagai tab.Anda memiliki beberapa alternatif:
beri tahu grep untuk menggunakan ekspresi reguler seperti yang didefinisikan oleh perl (perl memiliki
\t
sebagai tab):halaman manual memperingatkan bahwa ini adalah fitur "eksperimental". setidaknya
\t
tampaknya berfungsi dengan baik. tetapi fitur perl regex yang lebih canggih mungkin tidak.gunakan printf untuk mencetak karakter tab untuk Anda:
gunakan karakter tab literal:
yaitu: ketik
grep "
, lalu tekanctrl+v
, lalu tekantab
, lalu ketik" foo.txt
. menekanctrl+v
di terminal menyebabkan kunci berikutnya diambil kata demi kata. itu berarti terminal akan memasukkan karakter tab bukannya memicu beberapa fungsi yang terikat pada tombol tab.gunakan fitur kutip ansi c dari bash:
ini tidak bekerja di semua shell.
gunakan awk:
gunakan sed:
Lihat artikel wikipedia tentang ekspresi reguler untuk tinjauan umum dari kelas karakter yang ditentukan dalam POSIX dan sistem lainnya.
sumber
grep $'\t' foo.txt
(tapi saya biasanya akan menulisfgrep
sebagai gantinyagrep
)grep "$(printf '\t')${myvar}" foo.txt
. Itu bekerja dengan baik. Dengan beberapa percobaan, saya tidak bisa mendapatkan formulir terakhir yang berfungsi.grep
tidak bisa ditafsirkan secara diam-diam\t
sebagai tab? Apakah POSIX mengharuskan itu\t
berarti sesuatu yang lain? Mungkin itu seharusnya cocok dengan hanya literal\
diikuti oleht
?This is highly experimental and grep -P may warn of unimplemented features.
Mungkin bukan ide yang baik untuk digunakan-P
dalam sistem lawas. Theprintf
pilihan yang lebih baikIni bukan jawaban yang ingin Anda dengar, tetapi kemungkinan penggunaan escape sequence disediakan oleh bash
(jangan memasukkannya ke dalam tanda kutip ganda!).
sumber
grep $'\t'
.awk '/\t/'
adalah solusi favorit saya:Output:
a\t
.sumber
Satu selalu dapat menggunakan ascii hex-code untuk tab:
sumber