sed + wie lösche ich das zweite Zeichen "." aus der Zeile

sed + wie lösche ich das zweite Zeichen "." aus der Zeile

So löschen Sie das zweite Zeichen "." aus der Zeile

was ich habe, ist dies (aber es entfernt den ersten "." aus der Ausgabe

uname -r | sed s'/\./ /'

2 6.18-164.2.1.el5PAE

wobei ich folgende Ausgabe benötige

2.6 18-164.2.1.el5PAE

Antwort1

Fügen Sie einfach N an das Ende des Befehls an, damit er mit der N-ten Übereinstimmung übereinstimmt, und zwar wie folgt:

uname -r | sed 's/\./ /2'

Aber wofür brauchst du es?


Von der infoSeite weiter sed:

Auf den Befehl „s“ können null oder mehrere der folgenden FLAGS folgen:

G

Apply the replacement to _all_ matches to the REGEXP, not just the first.

NUMMER

Only replace the NUMBERth match of the REGEXP.

Antwort2

Hier sind einige Möglichkeiten, die Sekunde .aus einer Zeile einer Datei zu entfernen (sie wirken sich auf alle Zeilen der Datei aus):

  1. sed. Dubereitswas wahrscheinlich der beste Weg ist, aber hier ist ein anderer:

    sed 's/\([^.]*\.[^.]*\)\./\1 /' file 
    

    Dies sucht nach der längsten Nicht-Strecke .( [^.]*), dann nach einem .( \.), dann nach der nächsten Nicht-Strecke .und schließlich nach einem .( \.). Die Klammern erfassen die Muster, sodass wir darauf als verweisen können \1. Daher löscht der obige Befehl einfach das zweite .und ersetzt es durch ein Leerzeichen.

    Wenn Sie GNU haben sed(Standard unter Linux), können Sie es wie folgt vereinfachen:

    sed -r 's/([^.]*\.[^.]*)\./\1 /' file 
    
  2. Perl

    perl -pe 's/([^.]*\.[^.]*)\./\1 /' file 
    

    oder

    perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file 
    
  3. awk(Ich bin sicher, es gibt einen besseren Weg)

    awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file 
    

verwandte Informationen