Wenn ich mit (e) grep nach Registerkarten in einer Datei suche, verwende ich die Litteral-Registerkarte ( ^v + <tab>
). Ich kann nicht \t
als Ersatz für Tabulatoren in regulären Ausdrücken verwenden. Mit zB sed funktioniert dieser Ausdruck sehr gut.
Gibt es also eine Möglichkeit, einen nicht-literarischen Ersatz zu verwenden, <tab>
und welche Hintergründe gibt es für einen nicht funktionierenden / nicht interpretierten \t
?
bash
grep
regex
posix-compliant
Lasall
quelle
quelle
Antworten:
grep verwendet reguläre Ausdrücke gemäß POSIX . Aus welchen Gründen auch immer, POSIX wurde nicht
\t
als Registerkarte definiert .Sie haben mehrere Alternativen:
weise grep an, die regulären Ausdrücke wie von perl definiert zu verwenden (perl hat
\t
als tab):Die Manpage warnt, dass dies eine "experimentelle" Funktion ist. zumindest
\t
scheint es gut zu funktionieren. Fortgeschrittenere Perl-Regex-Funktionen jedoch möglicherweise nicht.Verwenden Sie printf, um ein Tabulatorzeichen für Sie zu drucken:
benutze das wörtliche Tabulatorzeichen:
das heißt: tippen
grep "
, dann drückenctrl+v
, dann drückentab
, dann tippen" foo.txt
. Durch Drückenctrl+v
des Terminals wird die nächste Taste wörtlich gedrückt. Dies bedeutet, dass das Terminal ein Tabulatorzeichen einfügt, anstatt eine an die Tabulatortaste gebundene Funktion auszulösen.benutze die Ansi c Quoting Funktion von bash:
Dies funktioniert nicht in allen Shells.
benutze awk:
benutze sed:
Im Wikipedia-Artikel über reguläre Ausdrücke finden Sie eine Übersicht über die in POSIX und anderen Systemen definierten Zeichenklassen.
quelle
grep $'\t' foo.txt
(aber ich würde normalerweise schreibenfgrep
anstattgrep
)grep "$(printf '\t')${myvar}" foo.txt
. Es hat gut funktioniert. Mit ein paar Versuchen konnte ich das letzte Formular nicht zum Laufen bringen.grep
nicht stillschweigend\t
als Tab interpretiert werden kann? Bedeutet dies für POSIX\t
etwas anderes? Vielleicht sollte es nur mit einem Literal\
gefolgt von einem übereinstimment
?This is highly experimental and grep -P may warn of unimplemented features.
Wahrscheinlich keine gute Idee, um-P
in Legacy-Systemen zu verwenden. Dieprintf
Wahl ist besserEs ist nicht genau die Antwort, die Sie hören möchten, aber eine mögliche Verwendung von Escape-Sequenzen bietet bash
(nicht in doppelte Anführungszeichen setzen!)
quelle
grep $'\t'
.awk '/\t/'
ist meine bevorzugte Problemumgehung:Ausgang:
a\t
.quelle
Man kann immer darauf zurückgreifen, ASCII-Hex-Code für tab zu verwenden:
quelle