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?


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}'

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.


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-

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

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 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
$

8

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

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

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.


4

Ein anderer Weg, cutanstelle von sed.

result=`echo $pid | cut -c 5-`

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.