# String beschneiden mit Bash

## skibbi

Hi,

wie kann ich bei dem String die letzten beiden Zeichen abschneiden?

```

47°C

```

Habe es mit 

```
cut -d '°' -f 1
```

 versucht aber cut meint, dass der Delimiter ein einzelnes Zeichen sein muss. Scheint mir so als würde cut nur ASCII Zeichen als Delimiter akzeptieren.

Ich brauche das ganze für ein SuperKaramba Theme, dass die Ausgabe von sensors parst.

----------

## Knieper

Dafuer gibt es x Loesungen, zB.:

```

>echo "47°C" | cut -d° -f1

47

>echo "47°C" | cut -d '°' -f1

47

>echo "47°C" | sed "s/\([0-9]*\)°C/\1/"

47

>echo "47°C" | tr -d "[°C]"

47

>echo "47°C" | head -c-3

47

```

----------

## skibbi

Die ersten beiden liefern mir noch den gleichen fehler wie vorher . :/

Aber mit sed gehts einwandfrei. Danke!

----------

## Necoro

Für den Fall, dass auch Komma-Werte vorkommen:

```
echo "47.4°C" | sed "s/\([0-9]\+\(\.[0-9]\+\)\?\)°C/\1/"
```

oder einfacher: "alles vor dem °C":

```
echo "47°C" | sed "s/\(.*\)°C/\1/"
```

oder noch einfacher:

```
echo "47°C" | sed "s/°C//"
```

----------

## DarKRaveR

Spricht irgendwas gegen ${var%°*) ?

Er fragte doch explizit nach der Bash!?

Alternativ kannst Du auch explizit immer die letzten beiden Zeichen abschneiden. Schaue Dir einfach mal das Kapitel Parameter Expansion an.

----------

## skibbi

Naja explizit Bash war mir keineswegs wichtig. Ging mir nur darum, dass ichsmittels bash skript umsetzen kann. Wer die Arbeit erledigt ist mir egal solange das ergebnis stimmt.

Geht doch bloß um ein einfache SuperKaramba Theme.  :Very Happy: 

----------

## DarKRaveR

Ah, also meintest Bash synonym für Shell. Wie gesagt, wenn Du keine zusätzlichen Prozesse starten willst, dann könntest Du es mit den Parameter-Expansions machen, es gibt da auch substring Ausdrücke, auch mit negativen Indizes etc. - Das ist aber definitiv nicht portabel   :Cool:  .

----------

## skibbi

 *DarKRaveR wrote:*   

> Ah, also meintest Bash synonym für Shell. Wie gesagt, wenn Du keine zusätzlichen Prozesse starten willst, dann könntest Du es mit den Parameter-Expansions machen, es gibt da auch substring Ausdrücke, auch mit negativen Indizes etc. - Das ist aber definitiv nicht portabel   .

 

ja sozusagen *schäm*  :Smile: 

Bin echt kein shell skript experte und regexp nutze ich auch viel zu selten als, dass mir die spielerisch von der hand gehen.  :Smile: 

----------

## Knieper

 *skibbi wrote:*   

> Aber mit sed gehts einwandfrei. Danke!

 

Ich haette die head-Variante genommen (bzw. angepasst), muesste eigentl. die schnellste sein.

----------

## DarKRaveR

Wohl kaum schneller als eine interne Parameter Expansion, auch ein head muß erstmal geforked werden.

Ich denke, daß ein ${varname: ${#varname}-2}, die schnellste Variante sein dürfte, oder wie gesagt eben nen substitution in der Shell von "°C" -> "".

----------

## Knieper

Dafuer muss erst einmal eine Bash laufen. Meine dash inkl. head forken schneller, als die Bash startet.

----------

## mv

 *DarKRaveR wrote:*   

> ${varname: ${#varname}-2}

 

Was soll'n das werden wenn's fertig ist? Sollten die letzten beiden Zeichen denn nicht entfernt werden?

Und natürlich macht man sowas mit POSIX. Dann geht's auch in dash u.ä. (und zwar schneller als mit jedem externen Programm)

```
${varname%??}
```

----------

## DarKRaveR

Na, was ist denn der substring von index 0 bis Länge-2? Richtig, alles außer den letzten beiden Zeichen.

Das eine % Expansion geht, wurde auch schon erwähnt, macht aber auch nichts ...   :Razz:  .

----------

## mv

 *DarKRaveR wrote:*   

> Na, was ist denn der substring von index 0 bis Länge-2? Richtig, alles außer den letzten beiden Zeichen.

 

Nur dass das Dein Ausdruck nicht ausgibt (zumindest nicht auf meiner Bash). Dein Ausdruck liefert nur die letzten beiden Zeichen.

 *Quote:*   

> Das eine % Expansion geht, wurde auch schon erwähnt, macht aber auch nichts ...

 

Nur dass das Erwähnte so klang, als ginge das nur auf der bash, während es in Wirklichkeit POSIX war. Und dass das Erwähnte i.a. auch etwas anderes getan hat, als die letzten beiden Zeichen abzuschneiden.

----------

## DarKRaveR

Humm, also bei mir ergibt ${varname: -2} die letzten beiden Zeichen.

${#varname} liefert die Länge der Variablen ...

Und in der Tat   :Embarassed:  , es muß heißen: ${varname: 0:${#varname}-2}

Man sollte schon die Starposition+Länge angeben   :Idea:  .

----------

