it-swarm.com.de

sed Ersetzen Sie nur das erste und letzte Leerzeichen in Zeilen

Ich habe eine Datei wie diese (mit viel mehr Zeilen):

01200 Carbon metabolism (1)

01210 2-Oxocarboxylic acid metabolism (1)

01212 Fatty acid metabolism (2)

01230 Biosynthesis of amino acids (1)

00020 Citrate cycle (TCA cycle) (1)

und ich möchte das erste und das letzte Leerzeichen für eine Registerkarte ersetzen, wie folgt:

01230\tBiosynthesis of amino acids\t(1)

00020\tCitrate cycle (TCA cycle)\t(1)

Ich habe folgendes versucht:

sed 's/ /\t/;s/ (/\t(/' eg_kaas_pwmap > res.tsv

Es hat funktioniert, aber in Zeilen wie in der Zeile mit "(TCA cycle)", Ich habe das \t davor, wie:

00020\tCitrate cycle\t(TCA cycle) (1).

Ich habe einige Modifikationen ausprobiert, aber nichts davon hat funktioniert.

Was soll ich machen?

3
Tiago Minuzzi

Dies ersetzt das erste und letzte Leerzeichen durch Tabulatoren:

sed -E 's/^([^ ]*) /\1\t/; s/ ([^ ]*)$/\t\1/' pwmap

Beispielsweise:

$ sed -E 's/^([^ ]*) /\1\t/; s/ ([^ ]*)$/\t\1/' pwmap
01200   Carbon metabolism       (1)
01210   2-Oxocarboxylic acid metabolism (1)
01212   Fatty acid metabolism   (2)
01230   Biosynthesis of amino acids     (1)
00020   Citrate cycle (TCA cycle)       (1)

Wie es funktioniert

  • s/^([^ ]*) /\1\t/

    Der reguläre Ausdruck ^([^ ]*) gleicht alle Nicht-Leerzeichen vom Anfang der Zeile bis zum ersten Leerzeichen ab und ordnet sie der Gruppe 1 zu. Diese wird durch die Gruppe 1 gefolgt von einem Tabulator ersetzt.

  • s/ ([^ ]*)$/\t\1/

    Der reguläre Ausdruck ([^ ]*)$ Stimmt vom letzten Leerzeichen bis zum Ende der Zeile mit allen in Gruppe 1 gespeicherten Nicht-Leerzeichen überein. Dies wird durch einen Tabulator gefolgt von Gruppe 1 ersetzt.

3
John1024