2016-04-28 14 views
0

Ich benutze Befehl tr 3 Mal nacheinander in diesem Fall:Ist es möglich, mehr tr-Befehle zu kombinieren?

tr -d [[:digit:]] | tr '[:upper:]' '[:lower:]' | tr -cd '[:alnum:]\nčšž' 

Ist es möglich, in 1 tr Befehl zu kombinieren 3 tr Befehle? Oder gibt es einen Weg, wie man das schneller macht?

+2

Die erste und dritte können Sie definitiv kombinieren, nur durch Ändern der ': alnum:' zu ': alpha:' in der dritten und Löschen der ersten. –

+1

das heißt, wenn Sie dies von Bash für eine kurze Zeichenfolge aufrufen, wird Ihre * beste * Leistung wahrscheinlich durch Eliminierung von 'tr' insgesamt und mit Shell-Builtins statt haben; Die Startkosten (zum Starten von "tr") übersteigen das, was Sie durch die schnellere Laufzeitleistung von tr im Vergleich zu integrierten Vorgängen erzielen. –

+0

... welche spezielle Bash-Version verwenden Sie? –

Antwort

2

Nehmen wir an, Sie eine Schnur durch bash sind kochend:

# this is your starting code 
f() { tr -d [[:digit:]] | tr '[:upper:]' '[:lower:]' | tr -cd '[:alnum:]\nčšž'; } 

# defining a test variable 
s='hello123WORLD456'$'\n''čšž' 

f <<<"$s" # writes "helloworld", a newline, then "čšž" 

... kann trivialerweise durch die Kombination von ersten und dritten geändert werden, da sie beide die gleiche grundlegende Operation (Löschen aller Zeichen in ein gegebener Satz - auch wenn in einem der beiden Fälle der Satz in einer ausschließenden Weise definiert ist):

# this behaves the same way 
f() { tr '[:upper:]' '[:lower:]' | tr -cd '[:alpha:]\nčšž'; } 

... jedoch, wenn eine moderne bash Release läuft, können Sie die gleiche Sache mit einem tun Paar von Parametererweiterungen, ohne den Overhead des Laufens tr:

s_lowercase=${s,,} 
s_alpha=${s_lowercase//[![:alpha:]čšž]/} 
echo "$s_alpha"