Care este cel mai bun mod de a face manipulare șir într-un script de shell?

voturi
3

Am o cale ca un șir de caractere într-un shell-script, ar putea fi absolută sau relativă:

/usr/userName/config.cfg

sau

../config.cfg

Vreau să extragă numele fișierului (partea care urmează după ultima /, astfel încât în ​​acest caz: „config.cfg“)

Eu dau cel mai bun mod de a face acest lucru este cu unele regex simplu? Este corect? Ar trebui sau ar trebui să folosesc sed sau awk în schimb?

caracteristici de manipulare șir Shell-scripting par destul de primative de la sine, și apar foarte ezoterice.

Orice exemplu soluții sunt apreciate.

Întrebat 12/03/2009 la 13:52
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
6

În loc de manipulare șir mi-ar folosi doar

file=`basename "$filename"`

Editare :

Vă mulțumim pentru a vă relaxa pentru unele sintaxa mai nouă pentru acest lucru (care presupune nume de fișier este deținut în $ filename):

file=$(basename $filename)
Publicat 12/03/2009 la 13:55
sursa de către utilizator

voturi
1

Cele mai multe medii au acces la perlși sunt mult mai confortabil cu cea pentru cea mai mare manipulare șir.

Dar , după cum sa menționat, de la ceva acest simplu, puteți utiliza basename.

Publicat 12/03/2009 la 13:58
sursa de către utilizator

voturi
11

Dacă sunteți în regulă cu ajutorul bash, puteți folosi extinderile șir bash:

FILE="/path/to/file.example"
FILE_BASENAME="${FILE##*/}"

E un pic criptic, dar acolade începe expansiunea variabilă, iar dublu hash face o îndepărtare lacom de modelul specificat de la Glob începutul șirului.

Dublu %% face același lucru de la sfârșitul unui șir de caractere, și un singur procent sau hash face o eliminare non-greedy.

De asemenea, un simplu înlocui construct este disponibil de asemenea:

FILE=${FILE// /_}

ar înlocui toate spațiile cu subliniere de exemplu.

O singură bară oblică din nou, este non-greedy.

Publicat 12/03/2009 la 14:06
sursa de către utilizator

voturi
1

Eu de obicei folosesc SED cu un regex simplu, ca aceasta:

echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'

rezultat:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'
config.cfg
Publicat 12/03/2009 la 14:27
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more