2013-08-18 4 views
7

Próbuję pobrać dwie ostatnie litery z nazwy pliku, które są wielkie i dołączają je do nazwy pliku małymi literami. I expeceted polecenie:Sed i różnice w Mac OS X z górnymi, dolnymi i całymi sekwencjami kontrolnymi przechwytywania

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

do osiągnięcia tego celu i na moim komputerze Ubuntu to działało w porządku, ale na moim komputerze Mac po prostu wypisuje 0/LXXE/ gdzie XX są poprawne litery od chwytania.

Jakie są odpowiedniki komputerów Mac z \0, \L i \E?

Rozejrzałem się po sieci i kilka osób zauważyło, że Mac OS X sed różni się od Ubuntu sed, ale większość wątków mówi o wymaganiu -i dla rozszerzenia pliku lub pustego łańcucha (co wcześniej mnie potknęło).

Odpowiedz

18

OSX sed jest starsza wersja i nie obsługuje funkcji \L, \E itp Install GNU sed na Mac przy użyciu:

brew install gnu-sed 
+7

'napar zainstalować --default- nazwy gnu-sed' do zainstalowania jako 'sed' zamiast' gsed' – TalkLittle

+1

"Uruchamianie Homebrew jako root jest bardzo niebezpieczne i nie jest już obsługiwane." – arekolek

+1

Dzięki @arekolek, to bardzo dobry punkt. Edytowałem. – anubhava

6

awk alternatywa:

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

Wygląda na to, że nie działa zgodnie z wymaganiami (przynajmniej w systemie OS X) - ostatnie dwa znaki są powtarzane. –

+1

@PaulR: O ile zrozumiałem, właśnie tego OP chciał: "... ... weź dwie ostatnie litery [...] i dołącz je ... *". Jeśli chcesz zastąpić * dwa ostatnie znaki małymi wersjami, spróbuj tego: 'ls | awk '{print substr ($ 0,1, długość (0 USD) -2) tolower (substr (0 USD, długość (0 USD) -1,2))} " – mschilli