2016-04-25 10 views
-1

entfernen Wie kann mir eine Schnur Rohr und fällt ein paar Zeichen von ihm weg ?, zB:Rohr aus einer Teil durch die letzten N Zeichen

$ echo forbes | ... -3 
for 
$ echo cucumber | ... -4 
cucu 
$ echo 1461624333 | .. -3 
1461624 
... 
etc. 

ich nicht Art und Weise ${str:0:-3} Syntax in einem Rohr zu verwenden, finden konnte, .

Antwort

1

Verwenden Sie ?

$ echo "forbes" | cut -b 1-3 
for 

Update:

von hinten zu rasieren, können Sie tun:

echo "forbes" | rev | cut -c (n+1)- | rev 

wo n ist die Anzahl der Zeichen, die Sie von Ende rasieren

echo "forbes" | rev | cut -c 4- | rev 
for 
+0

es immer zuerst 3 Zeichen zurückgibt, z Echokänguru cut -b 1-3' – Agzam

+0

Das ist, was '-b 1-3'' cut' sagen soll. Du beginnst bei 1 und erzählst wie viele Charaktere du haben willst. –

+2

das ist die Sache - ich weiß nicht, wie viele Zeichen in der Zeichenfolge, ich muss 3 letzte – Agzam

5

Rohrleitungen zu sed:

$ echo forbes | sed 's/...$//' 
for 

Dies entspricht den letzten drei Zeichen der Zeichenfolge und entfernt sie (ersetzt durch die leere Zeichenfolge).

die Anzahl der Zeichen parametrisieren, entfernen wir können dies in einer kleinen Funktion wickeln:

pipesubstr() { 
    sed "s/.\{$1\}$//" 
} 

verwendet werden wie folgt:

$ echo forbes | pipesubstr 3 
for 
$ echo cucumber | pipesubstr 4 
cucu 
$ echo 1461624333 | pipesubstr 3 
1461624 
+0

das scheint zu funktionieren! Groß. Vielen Dank! – Agzam

2

GNU head eine weitere Option (Entfernen der letzte n Zeichen aus dem Eingabestring als Ganzes - auch wenn es mehrere Zeilen) umfasst:

$ printf '1461624333' | head -c -3 # drop last 3 chars. 
1461624 

Beachten Sie, dass, wenn Sie echo statt printf verwenden, gibt es eine Hinter \n, die berücksichtigt werden müssen, so dass Sie 1 dem Grafen (und der Ausgang wird nicht haben eine Hinter \n) hinzufügen.

Caveat:head -c arbeitet auf Bytes, und deshalb funktioniert nur mit ASCII-Zeichen und anderer Single-Byte-Codierung.

0

Eine awk Lösung (entfernt die letzten n Zeichen aus jeder Zeile im Eingang):

$ echo '1461624333' | awk -v n=3 '{ print substr($0, 1, length($0)-n) }' # drop last 3 
1461624 

Caveat: Nicht alle awk Implementierungen sind locale-aware; zum Beispiel BSD awk wie auf OS X 10.11.4 gefunden ist nicht:

$ echo 'usä' | awk -v n=1 '{ print substr($0, 1, length($0)-n) }' 
us? # !! on OSX, mistakenly returns the first byte of multi-byte UTF8 char. 'ä' 
Verwandte Themen