Wie kann ich mit sed die ersten X-Zeichen von der Zeichenfolge entfernen?

126

Ich schreibe ein Shell-Skript für eingebettetes Linux in einer kleinen Industriebox. Ich habe eine Variable, die den Text enthält, pid: 1234und 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?

Kokesh
quelle
10
Wenn ${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 Sie sh(wie dash) oder möglicherweise verwenden zsh.
Bis auf weiteres angehalten.

Antworten:

0

Dies wird auch den Job machen:

echo "$pid"|awk '{print $2}'
Arnaud F.
quelle
27
Diese Frage ist der erste Treffer für "Erste N Zeichen in Zeichenfolge überspringen". Sie haben die Frage nicht beantwortet.
JWW
Dies scheint nicht zu funktionieren, und wenn ja, können Sie erklären, wie
Alexander Mills
Es funktioniert auf meinem System. Möglicherweise liegt ein Problem mit Ihrem Feldtrennzeichen vor awk -F": " '{print $2}'. Trotzdem nicht meine Lieblingslösung.
Mzuther
197

Folgendes sollte funktionieren:

var="pid: 1234"
var=${var:5}

Sind Sie sicher, dass bashdie Shell Ihr Skript ausführt?

Auch die POSIX-konform

var=${var#?????}

wäre der Verwendung eines externen Prozesses vorzuziehen, obwohl dies erfordert, dass Sie die 5 in Form eines Musters fester Länge fest codieren.

chepner
quelle
1
Sie können die Länge auch mit einem zweiten Parameter angeben: ${var:5:2}startet bei 1und kehrt zurück 12.
Max Candocia
107

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.

echo "$pid" | cut -c 5-
Randy der Entwickler
quelle
2
Dies ist die einfachste Lösung!
Brandon
2
Technisch hat das OP nach sed gefragt, aber ich denke, dies ist die beste Lösung für "Wie kann ich die ersten X-Zeichen von der Zeichenfolge git log --pretty=oneline | cut -c 42- | head
entfernen
1
+1 Einfache und hilfreiche Lösung. Als ich die URL als http: // <example.com> hatte und das Protokoll 'http: //' abschneiden wollte, muss ich 8 statt 7 Zeichen sagen. Ich weiß es nicht , aber so hat es bei mir funktioniert.
Santosh Kumar Arjunan
1
Santosh Kumar Arjunan: Das liegt daran, dass das Beispiel "echo" $ pid "| cut -c 4-" tatsächlich nicht die ersten 4 Zeichen schneidet, sondern Teilzeichenfolgen ab dem 4. Zeichen extrahiert. Daher werden tatsächlich die ersten 3 Zeichen geschnitten. Wenn Sie also 7 erste Zeichen schneiden möchten, möchten Sie alles aus dem 8. Zeichen extrahieren und somit tatsächlich "cut -c 8-"
al-ash
1
@ DeanHiller 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.
JustCarty
46

Verwenden Sie die -rOption ("Erweiterte reguläre Ausdrücke im Skript verwenden"), sedum die {n}Syntax zu verwenden:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Mark Longair
quelle
1
Wie wäre es für den Fall, wenn ich die letzten X Zeichen aus einer Zeichenfolge entfernen möchte?
Kokesh
5
@ Kokesh: Sie können tun sed -r 's/.{5}$//', um stattdessen die letzten 5 Zeichen zu entfernen
Mark Longair
7
Sie können dies ohne -r( -Ein OS X, IIRC) tun, wenn Sie den geschweiften Klammern entkommen (wissen Sie jedoch nicht, ob dies in OS X funktioniert).
Bis auf weiteres angehalten.
2
@ Tennis: Ich habe gerade überprüft - die Klammern zu entkommen (und wegzulassen -r/ -E) funktioniert in OS X.
Gordon Davisson
15

Schneiden Sie die ersten beiden Zeichen aus der Zeichenfolge aus:

$ string="1234567890"; echo "${string:2}"
34567890
dtp70
quelle
@ dtp70 Vielen Dank eine generische Antwort, es hat super funktioniert!
Wolfram77
10

Leiten Sie es durch, awk '{print substr($0,42)}'wobei 42 eins mehr ist als die Anzahl der zu löschenden Zeichen. Beispielsweise:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Ben
quelle
8

Die Chancen stehen gut, dass Sie es auch haben cutwerden. Wenn ja:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Shawn Chin
quelle
1
Das Problem cutist, dass es nicht sinnvoll mit Leerzeichenfolgen umgeht. Wenn Sie Leerzeichen tr -s ' '"quetschen", verhält es sich besser.
Thor
1
Es ist nicht dazu gedacht, alles zu singen und zu tanzen. es ist einfach und macht, was es auf der Dose sagt und ist weit verbreitet. Es sollte für diese Anforderungen einwandfrei funktionieren und ist sicherlich robuster als das Ausschneiden fester Zeichen aus bestimmten Positionen.
Shawn Chin
5

Nun, es wurden Lösungen hier mit sed, awk, cutund unter Verwendung von bashSyntax. Ich möchte nur eine andere POSIX-konforme Variante einwerfen:

$ echo "pid: 1234" | tail -c +6
1234

-cteilt 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.

Mecki
quelle
4

Ein anderer Weg, cutanstelle von sed.

result=`echo $pid | cut -c 5-`
Evgeny
quelle
Er möchte die ersten 4 Zeichen entfernen. Dies erhält die ersten 4 Zeichen.
MM.
2

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:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

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:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

Die -inach sedist 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.)

Baumkopf
quelle
1

Anstatt n Zeichen von Anfang an zu entfernen, können Sie die Ziffern möglicherweise direkt extrahieren. Wie so ...

$ echo "pid: 1234" | grep -Po "\d+"

Dies ist möglicherweise eine robustere Lösung und scheint intuitiver zu sein.

user1751825
quelle