Wenn ich mit (e) grep nach Tabs in einer Datei suche, benutze ich den Tab litteral ( ^v + <tab>
). Ich kann \t
nicht als Ersatz für Registerkarten in regulären Ausdrücken verwenden. Mit z.B. sed dieser Ausdruck funktioniert sehr gut.
Gibt es also eine Möglichkeit, einen nicht-literarischen Ersatz für <tab>
zu verwenden und was sind die Hintergründe für eine nicht arbeitende / nicht interpretierte \t
?
grep verwendet reguläre Ausdrücke wie in POSIX definiert. Aus welchen Gründen auch immer, POSIX hat \t
nicht als Tab definiert.
Sie haben mehrere Alternativen:
Teilen Sie Grep mit, dass die regulären Ausdrücke wie von Perl definiert verwendet werden (perl hat \t
als Registerkarte):
grep -P "\t" foo.txt
Die Manpage warnt davor, dass dies ein "experimentelles" Feature ist. mindestens \t
scheint gut zu funktionieren. aber erweiterte Perl Regex-Funktionen möglicherweise nicht.
Verwenden Sie printf, um ein Tabulatorzeichen für Sie zu drucken:
grep "$(printf '\t')" foo.txt
Verwenden Sie das Literalzeichen:
grep "^V<tab>" foo.txt
Das heißt: Geben Sie grep "
ein und drücken Sie ctrl+v
. Drücken Sie dann tab
und geben Sie " foo.txt
ein. Drücken von ctrl+v
im Terminal bewirkt, dass der nächste Schlüssel wörtlich genommen wird. Das bedeutet, dass das Terminal ein Tab-Zeichen einfügt, anstatt eine Funktion auszulösen, die an die Tab-Taste gebunden ist.
Verwenden Sie die ansi c-zitierende Funktion von bash:
grep $'\t' foo.txt
Dies funktioniert nicht in allen Shells.
benutze awk:
awk '/\t/'
benutze sed:
sed -n '/\t/p'
Im Wikipedia-Artikel über reguläre Ausdrücke finden Sie einen Überblick über die definierten Zeichenklassen in POSIX und anderen Systemen.
p>Es ist nicht genau die Antwort, die Sie hören möchten, aber eine mögliche Verwendung von Escape-Sequenzen bietet bash
command | grep $'\t'
(nicht in Anführungszeichen setzen!).
awk '/\t/'
ist meine bevorzugte Problemumgehung:
printf 'a\t\nb' | awk '/\t/'
Ausgabe: a\t
.
Man kann immer auf ascii hex-code für tab:
zurückgreifen$ echo "one"$'\t'"two" > input.txt
$ grep -P "\x9" input.txt
one two
$ grep $'\x9' input.txt
one two
Tags und Links bash grep regex posix-compliant