Wie grep für Tabs ohne Verwendung von literalen Tabs und warum nicht funktioniert?

115

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 ?

    
Lasall 14.07.2011, 13:59
quelle

4 Antworten

162

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>     
lesmana 14.07.2011, 17:04
quelle
12

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!).

    
enzotib 14.07.2011 16:15
quelle
2

awk '/\t/' ist meine bevorzugte Problemumgehung:

printf 'a\t\nb' | awk '/\t/'

Ausgabe: a\t .

    
quelle
1

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
    
Sergiy Kolodyazhnyy 03.07.2017 19:04
quelle

Tags und Links