Wie extrahieren Sie die ersten beiden Zeichen einer Zeichenkette in shell-scripting?
Beispiel:
USCAGoleta9311734.5021-120.1287855805
Möchte ich extrahieren:
US
- Vielen Dank an alle. Ich landete mit 'cut-c1-2', ehrlich gesagt wusste ich gar nicht "geschnitten" wurde es. Ich würde gerne sagen, ich bin ziemlich erfahren in die Kommandozeile, aber anscheinend habe ich viel zu lernen.
- just bewusst sein, dass cut laufen als separater Prozess - es wird langsamer sein als der interne-bash-Lösung, die ich gepostet nebenher in meiner Antwort. Das wird nicht keinen Unterschied machen, es sei denn, du bist der Verarbeitung von großen Datenmengen, aber Sie müssen halten Sie es im Hinterkopf.
- Bearbeiten Tatsächlich, ich denke, diese Zeile des Codes wird wahrscheinlich ausgeführt werden, die etwa 50.000 mal pro Bericht. So könnte ich nur mit dem internen Bash-Methode, - die, wie Sie sagten, sparen Sie einige dringend benötigte Ressourcen.
- Verwandte: unix.stackexchange.com/questions/3454/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich die effizienteste Methode, wenn Sie mit der
bash
shell (und Sie scheinen zu werden, basierend auf Ihre Kommentare), ist die Verwendung der sub-string Variante des parameter-expansion:Dies
short
werden die ersten beiden Zeichenlong
. Wennlong
ist kürzer als zwei Zeichen, dieshort
wird, identisch ist.Diese in-shell-Methode ist in der Regel besser, wenn du gehst, es zu tun eine Menge (wie 50.000 mal pro Bericht, wie Sie erwähnen), da es keine Prozess-Erzeugung overhead. Alle Lösungen, die die Verwendung von externen Programmen leiden wird, dass overhead.
Wenn Sie wollten auch, um sicherzustellen, eine mindestens Länge, Sie könnte pad es sich vor der hand mit etwas wie:
Dies würde sicherstellen, dass alles, was weniger als zwei Zeichen in der Länge war auf der rechten Seite aufgefüllt mit der Zeit (oder etwas anderes, nur durch ändern der Zeichen, der bei der Erstellung
tmpstr
). Es ist nicht klar, dass Sie dies brauchen, aber ich dachte, ich würde Sie für Vollständigkeit.Having said that, gibt es eine Reihe von Möglichkeiten, dies zu tun mit externen Programmen (wie wenn Sie nicht haben
bash
zur Verfügung, um Sie), von denen einige sind:Den ersten beiden (
cut
undhead
) sind identisch mit denen für eine einzeilige string - Sie sind im Grunde beide nur geben Sie wieder die ersten beiden Zeichen. Sie unterscheiden sich in, dasscut
geben Sie die ersten beiden Zeichen jeder Zeile undhead
geben Sie die ersten beiden Zeichen die gesamte EingabeDen Dritten nutzt man die
awk
sub-string-Funktion zum extrahieren der ersten zwei stellen und die vierte nutztsed
capture-Gruppen (mit()
und\1
) zu erfassen, die ersten beiden Zeichen und ersetzen Sie die gesamte Zeile mit Ihnen. Sie sind beide ähnlichcut
- Sie liefern die ersten beiden Zeichen jeder Zeile in der Eingabe.Nichts von alledem Fragen, wenn Sie sicher sind, dass Ihr Beitrag ist eine einzige Zeile, Sie alle haben eine identische Wirkung.
printf '%s'
stattecho
im Fall es sind seltsame Zeichen in der Zeichenfolge: stackoverflow.com/a/40423558/895245 Für die POSIX-besessen:head -c
ist nicht POSIX,cut -c
undawk substr
sind,sed \1
nicht sicher.einfachste Weg ist
Wo diese Auszüge
$length
Teilstring aus$string
bei$position
.Dies ist ein bash-builtin, damit awk oder sed ist nicht erforderlich.
Hinweg hast du mehrere gute Antworten und ich würde mich mit der Bash-builtin mich, aber da Sie gefragt haben
sed
undawk
und (fast) niemand sonst angebotenen Lösungen basieren auf Ihnen, ich biete Ihnen diese:und
Den
awk
eins sollte klar sein, aber hier eine Erklärung, diesed
eins:Einfach grep:
-P
option, um es kürzer zu machen. Alle regexs verstehen, dass Muster.Wenn Sie in
bash
können Sie sagen:Dies kann nur, was Sie brauchen...
colrm — entfernen von Spalten aus einer Datei
Lassen ersten zwei chars, einfach entfernen Sie Spalten ab 3
Ziemlich spät zwar, aber hier ist es
Oder
Oder
Wenn Ihr system eine andere shell (nicht
bash
), aber Ihr system hatbash
, dann können Sie immer noch verwenden die inhärente string-manipulation vonbash
durch aufrufenbash
mit einer Variablen:bash
wenn Sie nicht bereits es.Wenn Sie möchten, zu verwenden, shell-scripting und nicht sich auf nicht-posix-Erweiterungen (z.B. so genannte bashisms), können Sie mit Techniken, die keine Verzweigung externe tools wie grep, sed, cut, awk, etc., die machen dann Ihr Skript weniger effizient. Vielleicht Effizienz-und posix-Portabilität nicht wichtig ist in Ihrem Fall verwenden. Aber im Falle, dass er (oder Sie einfach als eine gute Gewohnheit), können Sie die folgenden parameter expansion option-Methode zum extrahieren der ersten beiden Zeichen der shell-variable:
Diese verwendet "kleinste prefix" parameter expansion zu entfernen, die die ersten zwei Zeichen (dies ist die
${var#??}
Teil), dann "kleinste suffix" parameter expansion (die${var%
Teil) zu entnehmen, dass alle-aber-die-ersten-zwei-Zeichen-string aus dem ursprünglichen Wert.Diese Methode wurde zuvor beschrieben, die in dieser Antwort der "Shell = Überprüfen, wenn die variable beginnt mit einem #" - Frage. Diese Antwort beschreibt auch ein paar ähnliche parameter-Erweiterung-Methoden, die verwendet werden können, in einem etwas anderen Kontext, dass die, die angewendet wird, um die ursprüngliche Frage hier.
Können Sie verwenden
printf
:wenn mystring = USCAGoleta9311734.5021-120.1287855805
drucken würde UNS
wobei 0 die Startposition und 2 ist, wie meny chars zu Lesen
awk
. Tut mir Leid, ich konnte nicht sagen, auf den ersten.Ist es das, was Ihr nach?
ref: substr
perl -e 'print substr $ARGV[0], 0, 2' 'USCAGoleta9311734.5021-120.1287855805'