2016-06-01 26 views
0

So, ich versuche, Tabs nach den Zahlen in dieser Tabelle zu entfernen, die ich von der Befehlszeile formatiere. Unten ist die Original-Datentabelle, direkt aus der Datei in Frage coipied und eingefügt:Seltsames Verhalten mit `sed`

treten
File Path     Line Description 
/home/nick/.bashrc    9   # TODO  Chop this into code import files 
/home/nick/.bashrc   204   # TODO  Add $HOME/os-setup to OS installation disc 
/home/nick/.bashrc   207   # TODO  Custom power actions don't work; system tray notifications 

Beim Hinzufügen eines endgültigen sed Befehls an das Rohr jedoch einige seltsamen Verhalten. Als Beispiel betrachten wir die sed Befehl unter:

cat somefile.txt | column -tx -s : | sed -e 's/\([0-9]\{1,\}\)/\1/g' 
File Path     Line Description 
/home/nick/.bashrc    9   # TODO  Chop this into code import files 
/home/nick/.bashrc   204   # TODO  Add $HOME/os-setup to OS installation disc 
/home/nick/.bashrc   207   # TODO  Custom power actions don't work; system tray notifications 

Diese Zahlen in jeder Zeile der Tabelle findet, ersetzt dann das Spiel mit dem ersten Teil des regulären Ausdrucks. Da das gesamte Spiel in Klammern eingeschlossen ist, bedeutet dies, dass sich nichts ändert, da es von ihm selbst ersetzt wird.

Allerdings, wenn ich dann den gleichen sed Befehl versuchen, aber ich füge Sie den \t Charakter, eine wörtliche Registerkarte mit den Anpassungs die sed Ausgabe regex scheint auch die Anzahl Spiel zu verkürzen! Siehe unten:

cat somefile.txt | column -tx -s : | sed -e 's/\([0-9]\{1,\}\)\t/\1/g' 
File Path     Line Description 
/home/nick/.bashrc    # TODO  Chop this into code import files 
/home/nick/.bashrc   20 # TODO  Add $HOME/os-setup to OS installation disc 
/home/nick/.bashrc   20 # TODO  Custom power actions don't work; system tray notifications 

Warum sed die letzte Ziffer von jeder Nummer gestutzt? Wie kann ich sed davon abhalten?

+0

könnten Sie bitte den sed-Code mit dem \ t zeigen? –

+0

interessant, kann es nicht reproduzieren –

+0

@NickBull: Woher kam die Datei? – sjsam

Antwort

1

Anstatt die Registerkarte nach der Nummer zu entfernen, entferne ich die Leerzeichen vor der # TODO.

awk (GNU) -Lösung

awk '{print gensub(/[ ]+( # TODO)/,"\\1","g",$0)} ' file 

Sed Lösung

sed -E 's/[ ]+# TODO/ # TODO/' file 

Output

File Path     Line Description 
/home/nick/.bashrc    9 # TODO  Chop this into code import files 
/home/nick/.bashrc   204 # TODO  Add $HOME/os-setup to OS installation disc 
/home/nick/.bashrc   207 # TODO  Custom power actions don't work; system tray notification 

Annahme

Die Beschreibung immer mit einem Hinweis # TODO

beginnen

Sie gewünschte Anzahl von Leerzeichen vor dem # TODO in Auswahl setzen kann. Ich habe zwei gesetzt.