Wie konvertiert man mit KSH "12345" in "1.2.3.4.5?"

543
robin

Wenn ich mit KSH einen String habe 12345und ihn konvertieren möchte 1.2.3.4.5, wie kann ich das tun?

Ich habe versucht es zu benutzen, cutaber es ist nicht unkompliziert.

echo "12345" | cut -c1 
-1
Sie sollten genauer sein. Was möchten Sie tun? Setzen Sie einen Punkt zwischen jede Kombination von zwei Ziffern in einer Variablen? Setzen Sie einen Punkt zwischen jeweils zwei Zeichen in jeder Zeile einer Datei? Setzen Sie nach den ersten vier Zeichen aller Zeilen der Standardeingabe, die aus nicht getrennten Ziffern bestehen, einen Punkt? Usw... SadBunny vor 9 Jahren 2
Können Sie bitte Ihre Antwort bearbeiten, um die genaue Versionsnummer von `ksh` anzugeben, mit der Sie dies tun möchten? Sie erwähnen in einem Kommentar, dass dies unter Solaris "ksh" ist, aber wie lautet die genaue Version von "ksh"? JakeGould vor 9 Jahren 0

4 Antworten auf die Frage

2
Caleb Xu

Verbindliche awkAntwort:

echo "12345" | awk '$1=$1' FS= OFS="." 

Ausgabe ist:

1.2.3.4.5 

Die Antwort wurde von einer der Lösungen in diesem Beitrag zum Stapelüberlauf geändert .

Schöne "awk" -Lösung. JakeGould vor 9 Jahren 0
Ich habe es auf Solaris ausprobiert und festgestellt, dass ich Nawk oder / usr / xpg4 / bin / awk verwenden muss. Andernfalls wird eine Fehlermeldung wie unten angezeigt. # echo "12345" | awk '$ 1 = $ 1' FS = OFS = "." awk: Syntaxfehler in der Nähe von Zeile 1 awk: Absprung in der Nähe von Zeile 1 robin vor 9 Jahren 0
Dann habe ich versucht, # echo "12345" | zu verwenden / usr / xpg4 / bin / awk '$ 1 = $ 1' FS = OFS = ".", das Ergebnis ist jedoch 12345, anders als erwartet 1.2.3.4.5 Können Sie uns raten? Vielen Dank! robin vor 9 Jahren 0
Entschuldigung, ich weiß es nicht. Awk-Syntax ist zwischen den Versionen ziemlich wählerisch. Glück mit "nawk"? Ich habe herausgefunden, dass dies auf BSD `awk` funktioniert, aber nicht auf GNU` awk`. Caleb Xu vor 9 Jahren 0
Gleiches Ergebnis für Nawk. Eigentlich finde ich einen anderen Weg: Echo "1234" | sed 's / \ (. \ \) / \ 1./g'. Das Ergebnis ist jedoch "1.2.3.4". Ich muss zuletzt entfernen. Die gesamte Befehlszeile lautet also: # temp_str = `echo" 1234 "| sed 's / \ (. \ \) / \ 1. / g'` # echo "$ " robin vor 9 Jahren 0
1
SadBunny

Perl Regex (mit Lookups und Rückverweisen) antwortet, um alles durch alles plus einen Punkt zu ersetzen, außer dem letzten (vorausgesetzt, das war die Frage):

$ echo "12345" | perl -wlpe 's/(.(?=.))/$1\./g' 1.2.3.4.5 
Dieser ist großartig! Ich möchte es aber einfach mit awk oder seed tun robin vor 9 Jahren 0
0
fd0

Eine sed-Lösung, die mit ksh und / usr / bin / sed unter OpenSolaris getestet wurde

echo "12345" | /usr/bin/sed -e 's/./&\./g' -e 's/\.$//' 
-1
JakeGould

Das sollte funktionieren. In bashund kshunter Mac OS X getestet :

echo "12345" | sed 's/\(.\\)/\1./g' | rev | cut -c 2- | rev 

Die Ausgabe ist:

1.2.3.4.5 

Und eine Aufschlüsselung des Befehls geht so:

  • Das echoist offensichtlich.
  • Der sedString teilt sich in Zeichen auf und fügt dann .jedes Zeichen hinzu.
  • rev kehrt die Zeichenfolge um.
  • cutschneidet die Zeichenfolge basierend auf der Zeichenposition; 2Ich glaube, das liegt an Newline.
  • rev wird erneut ausgeführt, um die umgekehrte Zeichenfolge in der ursprünglichen Reihenfolge wiederherzustellen.
Es sieht so aus, als ob rev auf meinem Solaris Ksh nicht funktioniert. Diese Antwort gibt mir zwar einen Hinweis und schließlich habe ich mein Problem gelöst. Bitte sehen Sie die obigen Kommentare robin vor 9 Jahren 1