2013-01-15 11 views
13

Schneiden Wie alle n Zeichen aus einer bestimmten Zeichenfolge mit Shell-Skripten zu entfernen,letzte n Zeichen in einer Zeichenkette mit Shell-Skript

ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,ssl999999:49188,,,,, 
ssl01:49188,abcf999:49188,,,,, 

Die Ausgabe in folgendem Format Mit

ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188,ssl999999:49188 
ssl01:49188,abcf999:49188 

Antwort

38

den Titel Zur Beantwortung von Ihnen spezifiziert Frage Schneiden letzten n Zeichen in einer Zeichenkette Sie die Teilextraktion Funktion in Bash nutzen können.

[email protected]$ A="123456" 
[email protected]$ echo ${A:0:-2} # remove last 2 chars 
1234 

jedoch auf der Grundlage Ihrer Beispiele erscheinen Sie alle Hinter Kommas zu entfernen wollen, in welchem ​​Fall Sie sed 's/,*$//' nutzen könnten.

[email protected]$ echo "ssl01:49188,ssl999999:49188,,,,," | sed 's/,*$//' 
ssl01:49188,ssl999999:49188 

oder für eine rein Bash Lösung, Sie Teilzeichenfolge Entfernung verwenden:

[email protected]$ X="ssl01:49188,ssl999999:49188,,,,," 
[email protected]$ shopt -s extglob 
[email protected]$ echo ${X%%+(,)} 
ssl01:49188,ssl999999:49188 

würde ich den sed Ansatz verwenden, wenn die Umwandlung in eine ganze Datei angewendet werden muss, und die Bash Teilzeichenfolge Entfernungsansatz, wenn die Zielzeichenfolge bereits in einer Bash-Variablen ist.

+6

Bitte beachten Sie, dass die erste Lösung nur für neuere Versionen von Bash (> = 4.2-alpha) funktioniert. – chiborg

+11

für ältere Versionen: Verwenden Sie #item, um die Länge der Zeichenfolge zu erhalten. Wenn Sie also versuchen, die letzten n Zeichen zu entfernen, verwenden Sie item = "abcdefgh" echo $ {item: 0: $ {# item} -n}; – rivu

+0

Ich weiß, das ist trivial, aber dachte, ich würde es hier angeben, weil es mich stolperte. Stellen Sie sicher, dass Sie das Semikolon auf das Ende legen, so wie Rivu es hat! Ich habe das Semikolon vergessen und alle möglichen Fehler bekommen! – user972276

11

seine sed:

sed 's/,\+$//' file 
+1

, das gut funktioniert, aber nur mit _GNU_ 'sed'. Eine POSIX-konforme Neuformulierung ist 'sed' s /, \ {1, \} // ''. Eine Version, die sowohl mit GNU als auch mit BSD/OSX 'sed' funktioniert:' sed -E/', + //' ' – mklement0

1

ich denke, man diese unnötigen , entfernen müssen s‘

sed 's/,,//g;s/\,$//g' your_file 

getestet:

> cat temp 
ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,ssl999999:49188,,,,, 
ssl01:49188,abcf999:49188,,,,, 
> sed 's/,,//g;s/\,$//g' temp 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188,ssl999999:49188 
ssl01:49188,abcf999:49188 
> 
1

Arbeiten mit sed:

sed 's/,,*$//g' file 
Verwandte Themen