wake-up-neo.com

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

Ich schreibe ein Shell-Skript für Embedded Linux in einer kleinen Industriebox. Ich habe eine Variable, die den Text pid: 1234 enthält, und ich möchte zuerst X-Zeichen aus der Zeile entfernen, so dass nur 1234 verbleibt. Ich habe mehr Variablen, die ich "säubern" muss, also muss ich die ersten X-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 zu machen:

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

Irgendwelche Ideen?

90
Kokesh

Dies wird auch die Arbeit erledigen:

echo "$pid"|awk '{print $2}'
18
Arnaud F.

Folgendes sollte funktionieren:

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

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

Sogar die POSIX-Kompatibilität

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

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

158
chepner

Hier ist eine kurze Methode zum Ausschneiden der ersten X-Zeichen mit cut(1). In diesem Beispiel werden die ersten 4 Zeichen entfernt.

echo "$pid" | cut -c 4-
67
Randy the Dev

Verwenden Sie die Option -r ("verwenden Sie erweiterte reguläre Ausdrücke im Skript") für sed, um die {n}-Syntax zu verwenden:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
43
Mark Longair

Schneiden Sie die ersten beiden Zeichen aus der Zeichenfolge aus:

string="1234567890"; echo "${string:2}"
8
dtp70

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

[[email protected]]$ echo "pid: 1234" | cut -d" " -f2
1234
6
Shawn Chin

pipe durch awk '{print substr($0,42)}', wobei 42 um eins größer ist als die Anzahl der Zeichen, die abgelegt werden sollen. Zum Beispiel:

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

Eine andere Möglichkeit, cut anstelle von sed zu verwenden.

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

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

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

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

0
user1751825

Nun, es gab hier Lösungen mit sed, awk, cut und der Verwendung von bash-Syntax. Ich möchte nur eine andere POSIX-konforme Variante einwerfen:

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

-c teilt tail mit, an welchem ​​Byte-Offset vom Ende der Eingabedaten gerechnet werden soll. Beginnt die Zahl jedoch mit einem +-Zeichen, so beginnt sie vom Anfang der Eingabedaten bis zum Ende.

0
Mecki

Ich fand die Antwort in pure sed von dieser Frage (zugegeben, nachdem diese Frage gepostet wurde). Dies tut genau das, was Sie gefragt haben, nur in sed: 

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

Der Punkt in sed '/./) ist das, was Sie übereinstimmen 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:
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

Der -i hinter sed dient zum Bearbeiten der Datei (entfernen Sie diese Option, wenn Sie den übereinstimmenden Ausdruck vor dem Bearbeiten der Datei testen möchten).

(FTR, ich habe diese Antwort nicht für einen Kredit gepostet, sondern einfach deshalb, weil ich dies vollständig mit Sed machen wollte, da diese Frage gestellt wurde und keine der vorherigen Antworten dieses Problem gelöst hat.)

0
treehead