2013-08-18 6 views
7

Sto cercando di estrarre le ultime due lettere da un nome di file che sono maiuscole e aggiungerle al nome del file in lettere minuscole. Ho expeceted il comando:differenze di OS e Mac OS X con sequenze di controllo superiori, inferiori e intere di acquisizione

ls | sed -e "s/.*\([A-Z][A-Z]\)$/\0\/\L\1\E/" 

per raggiungere questo obiettivo e sulla mia casella di Ubuntu ha funzionato bene, ma sul mio Mac semplicemente stampa un 0/LXXE/ dove XX sono le lettere corrette dalla cattura.

Quali sono gli equivalenti Mac sed di \0, \L e \E?

Ho dato un'occhiata al Web e diverse persone hanno notato che Mac OS X sed è diverso da Ubuntu ma la maggior parte dei thread parla del requisito -i per un'estensione di file o una stringa vuota (che in precedenza mi ha fatto inciampare).

risposta

18

OSX sed è la versione più vecchia e non supporta le funzioni \L, \E ecc installarvi GNU sed su Mac utilizzando:

brew install gnu-sed 
+7

'birra installare --default- chiama gnu-sed' per installare come 'sed' invece di' gsed' – TalkLittle

+1

"L'esecuzione di Homebrew come root è estremamente pericolosa e non più supportata." – arekolek

+1

Grazie a @arekolek, questo è un ottimo punto. Ho modificato – anubhava

6

awk alternativa:

ls | awk '{print $0 tolower(substr($0,length($0)-1,2))}' 
+0

Sembra non funzionare come richiesto (almeno su OS X) - gli ultimi due caratteri vengono ripetuti. –

+1

@PaulR: Per quanto ho capito, questo è ciò che l'OP voleva: '* ... prendere le ultime due lettere [...] e aggiungerle ... *'. Se vuoi * sostituire * gli ultimi due caratteri con le loro versioni minuscole, prova questo: 'ls | awk '{print substr ($ 0,1, length ($ 0) -2) tolower (substr ($ 0, length ($ 0) -1,2))}' ' – mschilli