Ich schreibe ein Shell-Skript für eingebettetes Linux in einer kleinen Industriebox. Ich habe eine Variable, die den Text enthält, pid: 1234
und ich möchte die ersten X-Zeichen aus der Zeile entfernen, sodass nur 1234 übrig bleiben. Ich habe mehr Variablen, die ich "bereinigen" muss, also muss ich X erste Zeichen wegschneiden und ${string:5}
funktioniert aus irgendeinem Grund in meinem System nicht.
Das einzige, was die Box zu haben scheint, ist sed
.
Ich versuche Folgendes zum Laufen zu bringen:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
Irgendwelche Ideen?
${string:5}
dies nicht funktioniert, verwenden Sie weder Bash noch eine andere Shell, die diese Syntax unterstützt. Welche Shell und Version verwenden Sie? Wie sieht dein Schebang aus? Meine Vermutung ist, dass Siesh
(wiedash
) oder möglicherweise verwendenzsh
.Antworten:
Dies wird auch den Job machen:
quelle
awk -F": " '{print $2}'
. Trotzdem nicht meine Lieblingslösung.Folgendes sollte funktionieren:
Sind Sie sicher, dass
bash
die Shell Ihr Skript ausführt?Auch die POSIX-konform
wäre der Verwendung eines externen Prozesses vorzuziehen, obwohl dies erfordert, dass Sie die 5 in Form eines Musters fester Länge fest codieren.
quelle
${var:5:2}
startet bei1
und kehrt zurück12
.Hier ist eine übersichtliche Methode, um die ersten X-Zeichen mit zu schneiden
cut(1)
. In diesem Beispiel werden die ersten 4 Zeichen entfernt, indem ein Teilstring abgeschnitten wird, der mit dem 5. Zeichen beginnt.quelle
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. Die geschweiften Klammern werden verwendet, um die Zeichenfolge mit gültigen Variablenzeichen zu verketten, um zu unterscheiden, was die Variable ist und was nicht. Wenn Sie weitere Informationen dazu wünschen, lesen Sie unter "Verkettung von Bash-Variablenzeichenfolgen" nach, um weitere Ressourcen zu erhalten, warum / wie dies funktioniert.Verwenden Sie die
-r
Option ("Erweiterte reguläre Ausdrücke im Skript verwenden"),sed
um die{n}
Syntax zu verwenden:quelle
sed -r 's/.{5}$//'
, um stattdessen die letzten 5 Zeichen zu entfernen-r
(-E
in OS X, IIRC) tun, wenn Sie den geschweiften Klammern entkommen (wissen Sie jedoch nicht, ob dies in OS X funktioniert).-r
/-E
) funktioniert in OS X.Schneiden Sie die ersten beiden Zeichen aus der Zeichenfolge aus:
quelle
Leiten Sie es durch,
awk '{print substr($0,42)}'
wobei 42 eins mehr ist als die Anzahl der zu löschenden Zeichen. Beispielsweise:quelle
Die Chancen stehen gut, dass Sie es auch haben
cut
werden. Wenn ja:quelle
cut
ist, dass es nicht sinnvoll mit Leerzeichenfolgen umgeht. Wenn Sie Leerzeichentr -s ' '
"quetschen", verhält es sich besser.Nun, es wurden Lösungen hier mit
sed
,awk
,cut
und unter Verwendung vonbash
Syntax. Ich möchte nur eine andere POSIX-konforme Variante einwerfen:-c
teilt dem Ende mit, mit welchem Byte-Offset begonnen werden soll, und zählt ab dem Ende der Eingabedaten. Wenn die Zahl jedoch mit einem+
Vorzeichen beginnt , erfolgt dies vom Anfang der Eingabedaten bis zum Ende.quelle
Ein anderer Weg,
cut
anstelle vonsed
.quelle
Ich fand die Antwort in reinem Sed, das von dieser Frage geliefert wurde (zugegebenermaßen gepostet, nachdem diese Frage gepostet wurde). Dies macht genau das, was Sie gefragt haben, nur in sed:
Der Punkt in
sed '/./
) ist das, was Sie abgleichen möchten. Ihre Frage ist genau das, was ich versucht habe, außer in meinem Fall wollte ich eine bestimmte Zeile in einer Datei abgleichen und sie dann auskommentieren. In meinem Fall war es:Die
-i
nachsed
ist die Datei an seinem Platz zu bearbeiten (diese Option entfernen , wenn Sie Ihren passenden Ausdruck Editieren der Datei vor dem Test wollen).(Ich habe dies gepostet, weil ich dies vollständig mit sed tun wollte, da diese Frage gestellt wurde und keine der zuvor beantworteten Fragen dieses Problem löste.)
quelle
Anstatt n Zeichen von Anfang an zu entfernen, können Sie die Ziffern möglicherweise direkt extrahieren. Wie so ...
Dies ist möglicherweise eine robustere Lösung und scheint intuitiver zu sein.
quelle