Jika Anda menambahkan | sed -n l
ke tail
perintah itu, untuk menampilkan karakter yang tidak dapat dicetak, Anda mungkin akan melihat sesuatu seperti:
N\bNA\bAM\bME\bE
Artinya, setiap karakter ditulis sebagai X
Backspace X
. Pada terminal modern, karakter akhirnya ditulis sendiri (karena Backspace alias BS alias \b
alias ^H
adalah karakter yang menggerakkan kursor satu kolom ke kiri) tanpa perbedaan. Tetapi dalam mesin tik tele-kuno, itu akan menyebabkan karakter muncul dalam huruf tebal karena mendapat tinta dua kali lebih banyak.
Namun, pager suka more
/ less
mengerti format itu artinya tebal, jadi itu yang membuat roff
teks tebal.
Beberapa implementasi manusia akan memanggil roff
dengan cara bahwa urutan itu tidak digunakan (atau panggilan internal col -b -p -x
untuk menghapusnya seperti dalam kasus man-db
implementasi (kecuali MAN_KEEP_FORMATTING
variabel lingkungan diatur)), dan tidak meminta pager ketika mereka mendeteksi output tidak pergi ke terminal (jadi man bash | grep NAME
akan bekerja di sana), tetapi bukan milik Anda.
Anda dapat menggunakan col -b
untuk menghapus urutan tersebut (ada tipe lain ( _
BS X
) juga untuk garis bawah).
Untuk sistem yang menggunakan GNU roff
(seperti GNU atau FreeBSD), Anda dapat menghindari urutan yang digunakan di tempat pertama dengan memastikan -c -b -u
opsi diteruskan grotty
, misalnya dengan memastikan -P-cbu
opsi dilewatkan ke groff
.
Misalnya dengan membuat skrip wrapper yang disebut groff
mengandung:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Anda menempatkan / usr / bin / groff di depan $PATH
.
Dengan macOS ' man
(juga menggunakan GNU roff
), Anda dapat membuat man-no-overstrike.conf
dengan:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Dan sebut man
sebagai:
man -C man-no-overstrike.conf bash | grep NAME
Masih dengan GNU roff
, jika Anda mengatur GROFF_SGR
variabel lingkungan (atau tidak mengatur GROFF_NO_SGR
variabel tergantung pada bagaimana default telah ditetapkan pada waktu kompilasi), maka grotty
(selama itu tidak lulus -c
opsi) akan menggunakan urutan pelarian terminal ANSI SGR sebagai gantinya dari trik BS untuk atribut karakter. less
memahaminya saat dipanggil dengan -R
opsi.
Orang FreeBSD memanggil grotty
dengan -c
opsi kecuali Anda meminta warna dengan mengatur variabel MANCOLOR (dalam hal -c
ini tidak diteruskan ke grotty
dan grotty
kembali ke default menggunakan ANSI SGR urutan melarikan diri di sana).
MANCOLOR=1 man bash | grep NAME
akan bekerja di sana.
Di Debian, GROFF_SGR bukan default. Jika kamu melakukan:
GROFF_SGR=1 man bash | grep NAME
Namun, karena man
stdout bukan terminal, dibutuhkan sendiri untuk meneruskan GROFF_NO_SGR
variabel ke grotty
(saya kira sehingga dapat digunakan col -bpx
untuk menghapus urutan BS karena col
tidak tahu cara menghapus urutan SGR, meskipun masih melakukannya dengan MAN_KEEP_FORMATTING
) yang menimpa GROFF_SGR
. Anda bisa melakukannya:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(di terminal) untuk mendapatkan urutan pelarian SGR.
Saat itu, Anda akan melihat bahwa beberapa dari NAMA itu tampil dengan huruf tebal di terminal (dan dalam less -R
pager). Jika Anda memberi makan output ke sed -n l
( MANPAGER='sed -n /NAME/l'
), Anda akan melihat sesuatu seperti:
\033[1mNAME\033[0m$
Di mana \e[1m
urutan untuk mengaktifkan huruf tebal di terminal yang kompatibel dengan ANSI, dan \e[0m
urutan untuk mengembalikan semua atribut SGR ke default.
Pada teks itu grep NAME
berfungsi sebagai teks yang memang berisi NAME
, tetapi Anda masih bisa memiliki masalah jika mencari teks di mana hanya bagian itu yang dicetak tebal / bergaris bawah ...